Current File : /home/mmdealscpanel/yummmdeals.com/ea-apr16.tar
include/apr-1/apr_dso.h000064400000005214150336140420010707 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_DSO_DOT_H
#define APR_DSO_DOT_H

/**
 * @file apr_dso.h
 * @brief APR Dynamic Object Handling Routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup apr_dso Dynamic Object Handling
 * @ingroup APR 
 * @{
 */

#if APR_HAS_DSO || defined(DOXYGEN)

/**
 * Structure for referencing dynamic objects
 */
typedef struct apr_dso_handle_t       apr_dso_handle_t;

/**
 * Structure for referencing symbols from dynamic objects
 */
typedef void *                        apr_dso_handle_sym_t;

/**
 * Load a DSO library.
 * @param res_handle Location to store new handle for the DSO.
 * @param path Path to the DSO library
 * @param ctx Pool to use.
 * @bug We aught to provide an alternative to RTLD_GLOBAL, which
 * is the only supported method of loading DSOs today.
 */
APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, 
                                       const char *path, apr_pool_t *ctx);

/**
 * Close a DSO library.
 * @param handle handle to close.
 */
APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle);

/**
 * Load a symbol from a DSO handle.
 * @param ressym Location to store the loaded symbol
 * @param handle handle to load the symbol from.
 * @param symname Name of the symbol to load.
 */
APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, 
                                      apr_dso_handle_t *handle,
                                      const char *symname);

/**
 * Report more information when a DSO function fails.
 * @param dso The dso handle that has been opened
 * @param buf Location to store the dso error
 * @param bufsize The size of the provided buffer
 */
APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buf, apr_size_t bufsize);

#endif /* APR_HAS_DSO */

/** @} */

#ifdef __cplusplus
}
#endif

#endif
include/apr-1/apr_ring.h000064400000045432150336140420011067 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * This code draws heavily from the 4.4BSD <sys/queue.h> macros
 * and Dean Gaudet's "splim/ring.h".
 * <http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/queue.h>
 * <http://www.arctic.org/~dean/splim/>
 *
 * We'd use Dean's code directly if we could guarantee the
 * availability of inline functions.
 */

#ifndef APR_RING_H
#define APR_RING_H

/**
 * @file apr_ring.h
 * @brief APR Rings
 */

/*
 * for offsetof()
 */
#include "apr_general.h"

/**
 * @defgroup apr_ring Ring Macro Implementations
 * @ingroup APR 
 * A ring is a kind of doubly-linked list that can be manipulated
 * without knowing where its head is.
 * @{
 */

/**
 * The Ring Element
 *
 * A ring element struct is linked to the other elements in the ring
 * through its ring entry field, e.g.
 * <pre>
 *      struct my_element_t {
 *          APR_RING_ENTRY(my_element_t) link;
 *          int foo;
 *          char *bar;
 *      };
 * </pre>
 *
 * An element struct may be put on more than one ring if it has more
 * than one APR_RING_ENTRY field. Each APR_RING_ENTRY has a corresponding
 * APR_RING_HEAD declaration.
 *
 * @warning For strict C standards compliance you should put the APR_RING_ENTRY
 * first in the element struct unless the head is always part of a larger
 * object with enough earlier fields to accommodate the offsetof() used
 * to compute the ring sentinel below. You can usually ignore this caveat.
 */
#define APR_RING_ENTRY(elem)						\
    struct {								\
	struct elem * volatile next;					\
	struct elem * volatile prev;					\
    }

/**
 * The Ring Head
 *
 * Each ring is managed via its head, which is a struct declared like this:
 * <pre>
 *      APR_RING_HEAD(my_ring_t, my_element_t);
 *      struct my_ring_t ring, *ringp;
 * </pre>
 *
 * This struct looks just like the element link struct so that we can
 * be sure that the typecasting games will work as expected.
 *
 * The first element in the ring is next after the head, and the last
 * element is just before the head.
 */
#define APR_RING_HEAD(head, elem)					\
    struct head {							\
	struct elem * volatile next;					\
	struct elem * volatile prev;					\
    }

/**
 * The Ring Sentinel
 *
 * This is the magic pointer value that occurs before the first and
 * after the last elements in the ring, computed from the address of
 * the ring's head.  The head itself isn't an element, but in order to
 * get rid of all the special cases when dealing with the ends of the
 * ring, we play typecasting games to make it look like one.
 *
 * Here is a diagram to illustrate the arrangements of the next and
 * prev pointers of each element in a single ring. Note that they point
 * to the start of each element, not to the APR_RING_ENTRY structure.
 *
 * <pre>
 *     +->+------+<-+  +->+------+<-+  +->+------+<-+
 *     |  |struct|  |  |  |struct|  |  |  |struct|  |
 *    /   | elem |   \/   | elem |   \/   | elem |  \
 * ...    |      |   /\   |      |   /\   |      |   ...
 *        +------+  |  |  +------+  |  |  +------+
 *   ...--|prev  |  |  +--|ring  |  |  +--|prev  |
 *        |  next|--+     | entry|--+     |  next|--...
 *        +------+        +------+        +------+
 *        | etc. |        | etc. |        | etc. |
 *        :      :        :      :        :      :
 * </pre>
 *
 * The APR_RING_HEAD is nothing but a bare APR_RING_ENTRY. The prev
 * and next pointers in the first and last elements don't actually
 * point to the head, they point to a phantom place called the
 * sentinel. Its value is such that last->next->next == first because
 * the offset from the sentinel to the head's next pointer is the same
 * as the offset from the start of an element to its next pointer.
 * This also works in the opposite direction.
 *
 * <pre>
 *        last                            first
 *     +->+------+<-+  +->sentinel<-+  +->+------+<-+
 *     |  |struct|  |  |            |  |  |struct|  |
 *    /   | elem |   \/              \/   | elem |  \
 * ...    |      |   /\              /\   |      |   ...
 *        +------+  |  |  +------+  |  |  +------+
 *   ...--|prev  |  |  +--|ring  |  |  +--|prev  |
 *        |  next|--+     |  head|--+     |  next|--...
 *        +------+        +------+        +------+
 *        | etc. |                        | etc. |
 *        :      :                        :      :
 * </pre>
 *
 * Note that the offset mentioned above is different for each kind of
 * ring that the element may be on, and each kind of ring has a unique
 * name for its APR_RING_ENTRY in each element, and has its own type
 * for its APR_RING_HEAD.
 *
 * Note also that if the offset is non-zero (which is required if an
 * element has more than one APR_RING_ENTRY), the unreality of the
 * sentinel may have bad implications on very perverse implementations
 * of C -- see the warning in APR_RING_ENTRY.
 *
 * @param hp   The head of the ring
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_SENTINEL(hp, elem, link)				\
    (struct elem *)((char *)(&(hp)->next) - APR_OFFSETOF(struct elem, link))

/**
 * The first element of the ring
 * @param hp   The head of the ring
 */
#define APR_RING_FIRST(hp)	(hp)->next
/**
 * The last element of the ring
 * @param hp   The head of the ring
 */
#define APR_RING_LAST(hp)	(hp)->prev
/**
 * The next element in the ring
 * @param ep   The current element
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_NEXT(ep, link)	(ep)->link.next
/**
 * The previous element in the ring
 * @param ep   The current element
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_PREV(ep, link)	(ep)->link.prev


/**
 * Initialize a ring
 * @param hp   The head of the ring
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_INIT(hp, elem, link) do {				\
	APR_RING_FIRST((hp)) = APR_RING_SENTINEL((hp), elem, link);	\
	APR_RING_LAST((hp))  = APR_RING_SENTINEL((hp), elem, link);	\
    } while (0)

/**
 * Determine if a ring is empty
 * @param hp   The head of the ring
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 * @return true or false
 */
#define APR_RING_EMPTY(hp, elem, link)					\
    (APR_RING_FIRST((hp)) == APR_RING_SENTINEL((hp), elem, link))

/**
 * Initialize a singleton element
 * @param ep   The element
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_ELEM_INIT(ep, link) do {				\
	APR_RING_NEXT((ep), link) = (ep);				\
	APR_RING_PREV((ep), link) = (ep);				\
    } while (0)


/**
 * Splice the sequence ep1..epN into the ring before element lep
 *   (..lep.. becomes ..ep1..epN..lep..)
 * @warning This doesn't work for splicing before the first element or on
 *   empty rings... see APR_RING_SPLICE_HEAD for one that does
 * @param lep  Element in the ring to splice before
 * @param ep1  First element in the sequence to splice in
 * @param epN  Last element in the sequence to splice in
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_SPLICE_BEFORE(lep, ep1, epN, link) do {		\
	APR_RING_NEXT((epN), link) = (lep);				\
	APR_RING_PREV((ep1), link) = APR_RING_PREV((lep), link);	\
	APR_RING_NEXT(APR_RING_PREV((lep), link), link) = (ep1);	\
	APR_RING_PREV((lep), link) = (epN);				\
    } while (0)

/**
 * Splice the sequence ep1..epN into the ring after element lep
 *   (..lep.. becomes ..lep..ep1..epN..)
 * @warning This doesn't work for splicing after the last element or on
 *   empty rings... see APR_RING_SPLICE_TAIL for one that does
 * @param lep  Element in the ring to splice after
 * @param ep1  First element in the sequence to splice in
 * @param epN  Last element in the sequence to splice in
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_SPLICE_AFTER(lep, ep1, epN, link) do {			\
	APR_RING_PREV((ep1), link) = (lep);				\
	APR_RING_NEXT((epN), link) = APR_RING_NEXT((lep), link);	\
	APR_RING_PREV(APR_RING_NEXT((lep), link), link) = (epN);	\
	APR_RING_NEXT((lep), link) = (ep1);				\
    } while (0)

/**
 * Insert the element nep into the ring before element lep
 *   (..lep.. becomes ..nep..lep..)
 * @warning This doesn't work for inserting before the first element or on
 *   empty rings... see APR_RING_INSERT_HEAD for one that does
 * @param lep  Element in the ring to insert before
 * @param nep  Element to insert
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_INSERT_BEFORE(lep, nep, link)				\
	APR_RING_SPLICE_BEFORE((lep), (nep), (nep), link)

/**
 * Insert the element nep into the ring after element lep
 *   (..lep.. becomes ..lep..nep..)
 * @warning This doesn't work for inserting after the last element or on
 *   empty rings... see APR_RING_INSERT_TAIL for one that does
 * @param lep  Element in the ring to insert after
 * @param nep  Element to insert
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_INSERT_AFTER(lep, nep, link)				\
	APR_RING_SPLICE_AFTER((lep), (nep), (nep), link)


/**
 * Splice the sequence ep1..epN into the ring before the first element
 *   (..hp.. becomes ..hp..ep1..epN..)
 * @param hp   Head of the ring
 * @param ep1  First element in the sequence to splice in
 * @param epN  Last element in the sequence to splice in
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_SPLICE_HEAD(hp, ep1, epN, elem, link) do {		\
	APR_RING_PREV((ep1), link) = APR_RING_SENTINEL((hp), elem, link);\
	APR_RING_NEXT((epN), link) = APR_RING_FIRST((hp));		\
	APR_RING_PREV(APR_RING_FIRST((hp)), link) = (epN);		\
	APR_RING_FIRST((hp)) = (ep1);					\
    } while (0)

/**
 * Splice the sequence ep1..epN into the ring after the last element
 *   (..hp.. becomes ..ep1..epN..hp..)
 * @param hp   Head of the ring
 * @param ep1  First element in the sequence to splice in
 * @param epN  Last element in the sequence to splice in
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_SPLICE_TAIL(hp, ep1, epN, elem, link) do {		\
	APR_RING_NEXT((epN), link) = APR_RING_SENTINEL((hp), elem, link);\
	APR_RING_PREV((ep1), link) = APR_RING_LAST((hp));		\
	APR_RING_NEXT(APR_RING_LAST((hp)), link) = (ep1);		\
	APR_RING_LAST((hp)) = (epN);					\
    } while (0)

/**
 * Insert the element nep into the ring before the first element
 *   (..hp.. becomes ..hp..nep..)
 * @param hp   Head of the ring
 * @param nep  Element to insert
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_INSERT_HEAD(hp, nep, elem, link)			\
	APR_RING_SPLICE_HEAD((hp), (nep), (nep), elem, link)

/**
 * Insert the element nep into the ring after the last element
 *   (..hp.. becomes ..nep..hp..)
 * @param hp   Head of the ring
 * @param nep  Element to insert
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_INSERT_TAIL(hp, nep, elem, link)			\
	APR_RING_SPLICE_TAIL((hp), (nep), (nep), elem, link)

/**
 * Concatenate ring h2 onto the end of ring h1, leaving h2 empty.
 * @param h1   Head of the ring to concatenate onto
 * @param h2   Head of the ring to concatenate
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_CONCAT(h1, h2, elem, link) do {			\
	if (!APR_RING_EMPTY((h2), elem, link)) {			\
	    APR_RING_SPLICE_TAIL((h1), APR_RING_FIRST((h2)),		\
				 APR_RING_LAST((h2)), elem, link);	\
	    APR_RING_INIT((h2), elem, link);				\
	}								\
    } while (0)

/**
 * Prepend ring h2 onto the beginning of ring h1, leaving h2 empty.
 * @param h1   Head of the ring to prepend onto
 * @param h2   Head of the ring to prepend
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_PREPEND(h1, h2, elem, link) do {			\
	if (!APR_RING_EMPTY((h2), elem, link)) {			\
	    APR_RING_SPLICE_HEAD((h1), APR_RING_FIRST((h2)),		\
				 APR_RING_LAST((h2)), elem, link);	\
	    APR_RING_INIT((h2), elem, link);				\
	}								\
    } while (0)

/**
 * Unsplice a sequence of elements from a ring
 * @warning The unspliced sequence is left with dangling pointers at either end
 * @param ep1  First element in the sequence to unsplice
 * @param epN  Last element in the sequence to unsplice
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_UNSPLICE(ep1, epN, link) do {				\
	APR_RING_NEXT(APR_RING_PREV((ep1), link), link) =		\
		     APR_RING_NEXT((epN), link);			\
	APR_RING_PREV(APR_RING_NEXT((epN), link), link) =		\
		     APR_RING_PREV((ep1), link);			\
    } while (0)

/**
 * Remove a single element from a ring
 * @warning The unspliced element is left with dangling pointers at either end
 * @param ep   Element to remove
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_REMOVE(ep, link)					\
    APR_RING_UNSPLICE((ep), (ep), link)

/**
 * Iterate over a ring
 * @param ep The current element
 * @param head The head of the ring
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_FOREACH(ep, head, elem, link)                          \
    for (ep = APR_RING_FIRST(head);                                     \
         ep != APR_RING_SENTINEL(head, elem, link);                     \
         ep = APR_RING_NEXT(ep, link))

/**
 * Iterate over a ring safe against removal of the current element
 * @param ep1 The current element
 * @param ep2 Iteration cursor
 * @param head The head of the ring
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_FOREACH_SAFE(ep1, ep2, head, elem, link)               \
    for (ep1 = APR_RING_FIRST(head), ep2 = APR_RING_NEXT(ep1, link);    \
         ep1 != APR_RING_SENTINEL(head, elem, link);                    \
         ep1 = ep2, ep2 = APR_RING_NEXT(ep1, link))

/* Debugging tools: */

#ifdef APR_RING_DEBUG
#include <stdio.h>
#include <assert.h>

#define APR_RING_CHECK_ONE(msg, ptr)					\
	fprintf(stderr, "*** %s %p\n", msg, ptr)

#define APR_RING_CHECK(hp, elem, link, msg)				\
	APR_RING_CHECK_ELEM(APR_RING_SENTINEL(hp, elem, link), elem, link, msg)

#define APR_RING_CHECK_ELEM(ep, elem, link, msg) do {			\
	struct elem *start = (ep);					\
	struct elem *here = start;					\
	fprintf(stderr, "*** ring check start -- %s\n", msg);		\
	do {								\
	    fprintf(stderr, "\telem %p\n", here);			\
	    fprintf(stderr, "\telem->next %p\n",			\
		    APR_RING_NEXT(here, link));				\
	    fprintf(stderr, "\telem->prev %p\n",			\
		    APR_RING_PREV(here, link));				\
	    fprintf(stderr, "\telem->next->prev %p\n",			\
		    APR_RING_PREV(APR_RING_NEXT(here, link), link));	\
	    fprintf(stderr, "\telem->prev->next %p\n",			\
		    APR_RING_NEXT(APR_RING_PREV(here, link), link));	\
	    if (APR_RING_PREV(APR_RING_NEXT(here, link), link) != here) { \
		fprintf(stderr, "\t*** elem->next->prev != elem\n");	\
		break;							\
	    }								\
	    if (APR_RING_NEXT(APR_RING_PREV(here, link), link) != here) { \
		fprintf(stderr, "\t*** elem->prev->next != elem\n");	\
		break;							\
	    }								\
	    here = APR_RING_NEXT(here, link);				\
	} while (here != start);					\
	fprintf(stderr, "*** ring check end\n");			\
    } while (0)

#define APR_RING_CHECK_CONSISTENCY(hp, elem, link)			\
	APR_RING_CHECK_ELEM_CONSISTENCY(APR_RING_SENTINEL(hp, elem, link),\
					elem, link)

#define APR_RING_CHECK_ELEM_CONSISTENCY(ep, elem, link) do {		\
	struct elem *start = (ep);					\
	struct elem *here = start;					\
	do {								\
	    assert(APR_RING_PREV(APR_RING_NEXT(here, link), link) == here); \
	    assert(APR_RING_NEXT(APR_RING_PREV(here, link), link) == here); \
	    here = APR_RING_NEXT(here, link);				\
	} while (here != start);					\
    } while (0)

#else
/**
 * Print a single pointer value to STDERR
 *   (This is a no-op unless APR_RING_DEBUG is defined.)
 * @param msg Descriptive message
 * @param ptr Pointer value to print
 */
#define APR_RING_CHECK_ONE(msg, ptr)
/**
 * Dump all ring pointers to STDERR, starting with the head and looping all
 * the way around the ring back to the head.  Aborts if an inconsistency
 * is found.
 *   (This is a no-op unless APR_RING_DEBUG is defined.)
 * @param hp   Head of the ring
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 * @param msg  Descriptive message
 */
#define APR_RING_CHECK(hp, elem, link, msg)
/**
 * Loops around a ring and checks all the pointers for consistency.  Pops
 * an assertion if any inconsistency is found.  Same idea as APR_RING_CHECK()
 * except that it's silent if all is well.
 *   (This is a no-op unless APR_RING_DEBUG is defined.)
 * @param hp   Head of the ring
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_CHECK_CONSISTENCY(hp, elem, link)
/**
 * Dump all ring pointers to STDERR, starting with the given element and
 * looping all the way around the ring back to that element.  Aborts if
 * an inconsistency is found.
 *   (This is a no-op unless APR_RING_DEBUG is defined.)
 * @param ep   The element
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 * @param msg  Descriptive message
 */
#define APR_RING_CHECK_ELEM(ep, elem, link, msg)
/**
 * Loops around a ring, starting with the given element, and checks all
 * the pointers for consistency.  Pops an assertion if any inconsistency
 * is found.  Same idea as APR_RING_CHECK_ELEM() except that it's silent
 * if all is well.
 *   (This is a no-op unless APR_RING_DEBUG is defined.)
 * @param ep   The element
 * @param elem The name of the element struct
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_CHECK_ELEM_CONSISTENCY(ep, elem, link)
#endif

/** @} */ 

#endif /* !APR_RING_H */
include/apr-1/apr_ldap_option.h000064400000020634150336140420012435 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file apr_ldap_option.h
 * @brief  APR-UTIL LDAP ldap_*_option() functions
 */
#ifndef APR_LDAP_OPTION_H
#define APR_LDAP_OPTION_H

/**
 * @addtogroup APR_Util_LDAP
 * @{
 */

#include "apr_ldap.h"

#if APR_HAS_LDAP

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*
 * The following defines handle the different TLS certificate
 * options available. If these options are missing, APR will try and
 * emulate support for this using the deprecated ldap_start_tls_s()
 * function.
 */
/**
 * Set SSL mode to one of APR_LDAP_NONE, APR_LDAP_SSL, APR_LDAP_STARTTLS
 * or APR_LDAP_STOPTLS.
 */
#define APR_LDAP_OPT_TLS 0x6fff
/**
 * Set zero or more CA certificates, client certificates or private
 * keys globally, or per connection (where supported).
 */
#define APR_LDAP_OPT_TLS_CERT 0x6ffe
/**
 * Set the LDAP library to no verify the server certificate.  This means
 * all servers are considered trusted.
 */
#define APR_LDAP_OPT_VERIFY_CERT 0x6ffd
/**
 * Set the LDAP library to indicate if referrals should be chased during
 * LDAP searches.
 */
#define APR_LDAP_OPT_REFERRALS 0x6ffc
/**
 * Set the LDAP library to indicate a maximum number of referral hops to
 * chase before giving up on the search.
 */
#define APR_LDAP_OPT_REFHOPLIMIT 0x6ffb

/**
 * Structures for the apr_set_option() cases
 */

/**
 * APR_LDAP_OPT_TLS_CERT
 *
 * This structure includes possible options to set certificates on
 * system initialisation. Different SDKs have different certificate
 * requirements, and to achieve this multiple certificates must be
 * specified at once passed as an (apr_array_header_t *).
 *
 * Netscape:
 * Needs the CA cert database (cert7.db), the client cert database (key3.db)
 * and the security module file (secmod.db) set at the system initialisation
 * time. Three types are supported: APR_LDAP_CERT7_DB, APR_LDAP_KEY3_DB and
 * APR_LDAP_SECMOD.
 *
 * To specify a client cert connection, a certificate nickname needs to be
 * provided with a type of APR_LDAP_CERT.
 * int ldapssl_enable_clientauth( LDAP *ld, char *keynickname,
 * char *keypasswd, char *certnickname );
 * keynickname is currently not used, and should be set to ""
 *
 * Novell:
 * Needs CA certificates and client certificates set at system initialisation
 * time. Three types are supported: APR_LDAP_CA*, APR_LDAP_CERT* and
 * APR_LDAP_KEY*.
 *
 * Certificates cannot be specified per connection.
 *
 * The functions used are:
 * ldapssl_add_trusted_cert(serverTrustedRoot, serverTrustedRootEncoding);
 * Clients certs and keys are set at system initialisation time with
 * int ldapssl_set_client_cert (
 *  void   *cert,
 *  int     type
 *  void   *password); 
 * type can be LDAPSSL_CERT_FILETYPE_B64 or LDAPSSL_CERT_FILETYPE_DER
 *  ldapssl_set_client_private_key(clientPrivateKey,
 *                                 clientPrivateKeyEncoding,
 *                                 clientPrivateKeyPassword);
 *
 * OpenSSL:
 * Needs one or more CA certificates to be set at system initialisation time
 * with a type of APR_LDAP_CA*.
 *
 * May have one or more client certificates set per connection with a type of
 * APR_LDAP_CERT*, and keys with APR_LDAP_KEY*.
 */
/** CA certificate type unknown */
#define APR_LDAP_CA_TYPE_UNKNOWN    0
/** binary DER encoded CA certificate */
#define APR_LDAP_CA_TYPE_DER        1
/** PEM encoded CA certificate */
#define APR_LDAP_CA_TYPE_BASE64     2
/** Netscape/Mozilla cert7.db CA certificate database */
#define APR_LDAP_CA_TYPE_CERT7_DB   3
/** Netscape/Mozilla secmod file */
#define APR_LDAP_CA_TYPE_SECMOD     4
/** Client certificate type unknown */
#define APR_LDAP_CERT_TYPE_UNKNOWN  5
/** binary DER encoded client certificate */
#define APR_LDAP_CERT_TYPE_DER      6
/** PEM encoded client certificate */
#define APR_LDAP_CERT_TYPE_BASE64   7
/** Netscape/Mozilla key3.db client certificate database */
#define APR_LDAP_CERT_TYPE_KEY3_DB  8
/** Netscape/Mozilla client certificate nickname */
#define APR_LDAP_CERT_TYPE_NICKNAME 9
/** Private key type unknown */
#define APR_LDAP_KEY_TYPE_UNKNOWN   10
/** binary DER encoded private key */
#define APR_LDAP_KEY_TYPE_DER       11
/** PEM encoded private key */
#define APR_LDAP_KEY_TYPE_BASE64    12
/** PKCS#12 encoded client certificate */
#define APR_LDAP_CERT_TYPE_PFX      13
/** PKCS#12 encoded private key */
#define APR_LDAP_KEY_TYPE_PFX       14
/** Openldap directory full of base64-encoded cert 
 * authorities with hashes in corresponding .0 directory
 */
#define APR_LDAP_CA_TYPE_CACERTDIR_BASE64 15


/**
 * Certificate structure.
 *
 * This structure is used to store certificate details. An array of
 * these structures is passed to apr_ldap_set_option() to set CA
 * and client certificates.
 * @param type Type of certificate APR_LDAP_*_TYPE_*
 * @param path Path, file or nickname of the certificate
 * @param password Optional password, can be NULL
 */
typedef struct apr_ldap_opt_tls_cert_t apr_ldap_opt_tls_cert_t;
struct apr_ldap_opt_tls_cert_t {
    int type;
    const char *path;
    const char *password;
};

/**
 * APR_LDAP_OPT_TLS
 *
 * This sets the SSL level on the LDAP handle.
 *
 * Netscape/Mozilla:
 * Supports SSL, but not STARTTLS
 * SSL is enabled by calling ldapssl_install_routines().
 *
 * Novell:
 * Supports SSL and STARTTLS.
 * SSL is enabled by calling ldapssl_install_routines(). Note that calling
 * other ldap functions before ldapssl_install_routines() may cause this
 * function to fail.
 * STARTTLS is enabled by calling ldapssl_start_tls_s() after calling
 * ldapssl_install_routines() (check this).
 *
 * OpenLDAP:
 * Supports SSL and supports STARTTLS, but none of this is documented:
 * http://www.openldap.org/lists/openldap-software/200409/msg00618.html
 * Documentation for both SSL support and STARTTLS has been deleted from
 * the OpenLDAP documentation and website.
 */

/** No encryption */
#define APR_LDAP_NONE 0
/** SSL encryption (ldaps://) */
#define APR_LDAP_SSL 1
/** TLS encryption (STARTTLS) */
#define APR_LDAP_STARTTLS 2
/** end TLS encryption (STOPTLS) */
#define APR_LDAP_STOPTLS 3

/**
 * APR LDAP get option function
 *
 * This function gets option values from a given LDAP session if
 * one was specified. It maps to the native ldap_get_option() function.
 * @param pool The pool to use
 * @param ldap The LDAP handle
 * @param option The LDAP_OPT_* option to return
 * @param outvalue The value returned (if any)
 * @param result_err The apr_ldap_err_t structure contained detailed results
 *        of the operation.
 */
APU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
                                          LDAP *ldap,
                                          int option,
                                          void *outvalue,
                                          apr_ldap_err_t **result_err);

/**
 * APR LDAP set option function
 * 
 * This function sets option values to a given LDAP session if
 * one was specified. It maps to the native ldap_set_option() function.
 * 
 * Where an option is not supported by an LDAP toolkit, this function
 * will try and apply legacy functions to achieve the same effect,
 * depending on the platform.
 * @param pool The pool to use
 * @param ldap The LDAP handle
 * @param option The LDAP_OPT_* option to set
 * @param invalue The value to set
 * @param result_err The apr_ldap_err_t structure contained detailed results
 *        of the operation.
 */
APU_DECLARE_LDAP(int) apr_ldap_set_option(apr_pool_t *pool,
                                          LDAP *ldap,
                                          int option,
                                          const void *invalue,
                                          apr_ldap_err_t **result_err);

#ifdef __cplusplus
}
#endif

#endif /* APR_HAS_LDAP */

/** @} */

#endif /* APR_LDAP_OPTION_H */

include/apr-1/apr_allocator.h000064400000014111150336140420012076 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_ALLOCATOR_H
#define APR_ALLOCATOR_H

/**
 * @file apr_allocator.h
 * @brief APR Internal Memory Allocation
 */

#include "apr.h"
#include "apr_errno.h"
#define APR_WANT_MEMFUNC /**< For no good reason? */
#include "apr_want.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup apr_allocator Internal Memory Allocation
 * @ingroup APR 
 * @{
 */

/** the allocator structure */
typedef struct apr_allocator_t apr_allocator_t;
/** the structure which holds information about the allocation */
typedef struct apr_memnode_t apr_memnode_t;

/** basic memory node structure
 * @note The next, ref and first_avail fields are available for use by the
 *       caller of apr_allocator_alloc(), the remaining fields are read-only.
 *       The next field has to be used with caution and sensibly set when the
 *       memnode is passed back to apr_allocator_free().  See apr_allocator_free()
 *       for details.  
 *       The ref and first_avail fields will be properly restored by
 *       apr_allocator_free().
 */
struct apr_memnode_t {
    apr_memnode_t *next;            /**< next memnode */
    apr_memnode_t **ref;            /**< reference to self */
    apr_uint32_t   index;           /**< size */
    apr_uint32_t   free_index;      /**< how much free */
    char          *first_avail;     /**< pointer to first free memory */
    char          *endp;            /**< pointer to end of free memory */
};

/** The base size of a memory node - aligned.  */
#define APR_MEMNODE_T_SIZE APR_ALIGN_DEFAULT(sizeof(apr_memnode_t))

/** Symbolic constants */
#define APR_ALLOCATOR_MAX_FREE_UNLIMITED 0

/**
 * Create a new allocator
 * @param allocator The allocator we have just created.
 *
 */
APR_DECLARE(apr_status_t) apr_allocator_create(apr_allocator_t **allocator)
                          __attribute__((nonnull(1)));

/**
 * Destroy an allocator
 * @param allocator The allocator to be destroyed
 * @remark Any memnodes not given back to the allocator prior to destroying
 *         will _not_ be free()d.
 */
APR_DECLARE(void) apr_allocator_destroy(apr_allocator_t *allocator)
                  __attribute__((nonnull(1)));

/**
 * Allocate a block of mem from the allocator
 * @param allocator The allocator to allocate from
 * @param size The size of the mem to allocate (excluding the
 *        memnode structure)
 */
APR_DECLARE(apr_memnode_t *) apr_allocator_alloc(apr_allocator_t *allocator,
                                                 apr_size_t size)
                             __attribute__((nonnull(1)));

/**
 * Free a list of blocks of mem, giving them back to the allocator.
 * The list is typically terminated by a memnode with its next field
 * set to NULL.
 * @param allocator The allocator to give the mem back to
 * @param memnode The memory node to return
 */
APR_DECLARE(void) apr_allocator_free(apr_allocator_t *allocator,
                                     apr_memnode_t *memnode)
                  __attribute__((nonnull(1,2)));
 
/**
 * Get the true size that would be allocated for the given size (including
 * the header and alignment).
 * @param allocator The allocator from which to the memory would be allocated
 * @param size The size to align
 * @return The aligned size (or zero on apr_size_t overflow)
 */
APR_DECLARE(apr_size_t) apr_allocator_align(apr_allocator_t *allocator,
                                            apr_size_t size);

#include "apr_pools.h"

/**
 * Set the owner of the allocator
 * @param allocator The allocator to set the owner for
 * @param pool The pool that is to own the allocator
 * @remark Typically pool is the highest level pool using the allocator
 */
/*
 * XXX: see if we can come up with something a bit better.  Currently
 * you can make a pool an owner, but if the pool doesn't use the allocator
 * the allocator will never be destroyed.
 */
APR_DECLARE(void) apr_allocator_owner_set(apr_allocator_t *allocator,
                                          apr_pool_t *pool)
                  __attribute__((nonnull(1)));

/**
 * Get the current owner of the allocator
 * @param allocator The allocator to get the owner from
 */
APR_DECLARE(apr_pool_t *) apr_allocator_owner_get(apr_allocator_t *allocator)
                          __attribute__((nonnull(1)));

/**
 * Set the current threshold at which the allocator should start
 * giving blocks back to the system.
 * @param allocator The allocator to set the threshold on
 * @param size The threshold.  0 == unlimited.
 */
APR_DECLARE(void) apr_allocator_max_free_set(apr_allocator_t *allocator,
                                             apr_size_t size)
                  __attribute__((nonnull(1)));

#include "apr_thread_mutex.h"

#if APR_HAS_THREADS
/**
 * Set a mutex for the allocator to use
 * @param allocator The allocator to set the mutex for
 * @param mutex The mutex
 */
APR_DECLARE(void) apr_allocator_mutex_set(apr_allocator_t *allocator,
                                          apr_thread_mutex_t *mutex)
                  __attribute__((nonnull(1)));

/**
 * Get the mutex currently set for the allocator
 * @param allocator The allocator
 */
APR_DECLARE(apr_thread_mutex_t *) apr_allocator_mutex_get(
                                          apr_allocator_t *allocator)
                                  __attribute__((nonnull(1)));

#endif /* APR_HAS_THREADS */

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* !APR_ALLOCATOR_H */
include/apr-1/apr_portable.h000064400000050027150336140420011734 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* This header file is where you should put ANY platform specific information.
 * This should be the only header file that programs need to include that 
 * actually has platform dependent code which refers to the .
 */
#ifndef APR_PORTABLE_H
#define APR_PORTABLE_H
/**
 * @file apr_portable.h
 * @brief APR Portability Routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_thread_proc.h"
#include "apr_file_io.h"
#include "apr_network_io.h"
#include "apr_errno.h"
#include "apr_global_mutex.h"
#include "apr_proc_mutex.h"
#include "apr_time.h"
#include "apr_dso.h"
#include "apr_shm.h"

#if APR_HAVE_DIRENT_H
#include <dirent.h>
#endif
#if APR_HAVE_FCNTL_H
#include <fcntl.h>
#endif
#if APR_HAVE_PTHREAD_H
#include <pthread.h>
#endif
#if APR_HAVE_SEMAPHORE_H
#include <semaphore.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_portabile Portability Routines
 * @ingroup APR 
 * @{
 */

#ifdef WIN32
/* The primitives for Windows types */
typedef HANDLE                apr_os_file_t;
typedef HANDLE                apr_os_dir_t;
typedef SOCKET                apr_os_sock_t;
typedef HANDLE                apr_os_proc_mutex_t;
typedef HANDLE                apr_os_thread_t;
typedef HANDLE                apr_os_proc_t;
typedef DWORD                 apr_os_threadkey_t; 
typedef FILETIME              apr_os_imp_time_t;
typedef SYSTEMTIME            apr_os_exp_time_t;
typedef HANDLE                apr_os_dso_handle_t;
typedef HANDLE                apr_os_shm_t;

#elif defined(OS2)
typedef HFILE                 apr_os_file_t;
typedef HDIR                  apr_os_dir_t;
typedef int                   apr_os_sock_t;
typedef HMTX                  apr_os_proc_mutex_t;
typedef TID                   apr_os_thread_t;
typedef PID                   apr_os_proc_t;
typedef PULONG                apr_os_threadkey_t; 
typedef struct timeval        apr_os_imp_time_t;
typedef struct tm             apr_os_exp_time_t;
typedef HMODULE               apr_os_dso_handle_t;
typedef void*                 apr_os_shm_t;

#elif defined(__BEOS__)
#include <kernel/OS.h>
#include <kernel/image.h>

struct apr_os_proc_mutex_t {
	sem_id sem;
	int32  ben;
};

typedef int                   apr_os_file_t;
typedef DIR                   apr_os_dir_t;
typedef int                   apr_os_sock_t;
typedef struct apr_os_proc_mutex_t  apr_os_proc_mutex_t;
typedef thread_id             apr_os_thread_t;
typedef thread_id             apr_os_proc_t;
typedef int                   apr_os_threadkey_t;
typedef struct timeval        apr_os_imp_time_t;
typedef struct tm             apr_os_exp_time_t;
typedef image_id              apr_os_dso_handle_t;
typedef void*                 apr_os_shm_t;

#elif defined(NETWARE)
typedef int                   apr_os_file_t;
typedef DIR                   apr_os_dir_t;
typedef int                   apr_os_sock_t;
typedef NXMutex_t             apr_os_proc_mutex_t;
typedef NXThreadId_t          apr_os_thread_t;
typedef long                  apr_os_proc_t;
typedef NXKey_t               apr_os_threadkey_t; 
typedef struct timeval        apr_os_imp_time_t;
typedef struct tm             apr_os_exp_time_t;
typedef void *                apr_os_dso_handle_t;
typedef void*                 apr_os_shm_t;

#else
/* Any other OS should go above this one.  This is the lowest common
 * denominator typedefs for  all UNIX-like systems.  :)
 */

/** Basic OS process mutex structure. */
struct apr_os_proc_mutex_t {
#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE
    /** Value used for SYS V Semaphore, FCNTL and FLOCK serialization */
    int crossproc;
#endif
#if APR_HAS_PROC_PTHREAD_SERIALIZE
    /** Value used for PTHREAD serialization */
    pthread_mutex_t *pthread_interproc;
#endif
#if APR_HAS_THREADS
    /* If no threads, no need for thread locks */
#if APR_USE_PTHREAD_SERIALIZE
    /** This value is currently unused within APR and Apache */ 
    pthread_mutex_t *intraproc;
#endif
#endif
#if APR_HAS_POSIXSEM_SERIALIZE
    /** Value used for POSIX semaphores serialization */
    sem_t *psem_interproc;
#endif
};

typedef int                   apr_os_file_t;        /**< native file */
typedef DIR                   apr_os_dir_t;         /**< native dir */
typedef int                   apr_os_sock_t;        /**< native dir */
typedef struct apr_os_proc_mutex_t  apr_os_proc_mutex_t; /**< native process
                                                          *   mutex
                                                          */
#if APR_HAS_THREADS && APR_HAVE_PTHREAD_H 
typedef pthread_t             apr_os_thread_t;      /**< native thread */
typedef pthread_key_t         apr_os_threadkey_t;   /**< native thread address
                                                     *   space */
#endif
typedef pid_t                 apr_os_proc_t;        /**< native pid */
typedef struct timeval        apr_os_imp_time_t;    /**< native timeval */
typedef struct tm             apr_os_exp_time_t;    /**< native tm */
/** @var apr_os_dso_handle_t
 * native dso types
 */
#if defined(HPUX) || defined(HPUX10) || defined(HPUX11)
#include <dl.h>
typedef shl_t                 apr_os_dso_handle_t;
#elif defined(DARWIN)
#include <mach-o/dyld.h>
typedef NSModule              apr_os_dso_handle_t;
#else
typedef void *                apr_os_dso_handle_t;
#endif
typedef void*                 apr_os_shm_t;         /**< native SHM */

#endif

/**
 * @typedef apr_os_sock_info_t
 * @brief alias for local OS socket
 */
/**
 * everything APR needs to know about an active socket to construct
 * an APR socket from it; currently, this is platform-independent
 */
struct apr_os_sock_info_t {
    apr_os_sock_t *os_sock; /**< always required */
    struct sockaddr *local; /**< NULL if not yet bound */
    struct sockaddr *remote; /**< NULL if not connected */
    int family;             /**< always required (APR_INET, APR_INET6, etc.) */
    int type;               /**< always required (SOCK_STREAM, SOCK_DGRAM, etc.) */
    int protocol;           /**< 0 or actual protocol (APR_PROTO_SCTP, APR_PROTO_TCP, etc.) */
};

typedef struct apr_os_sock_info_t apr_os_sock_info_t;

#if APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN)
/** Opaque global mutex type */
#define apr_os_global_mutex_t apr_os_proc_mutex_t
/** @return apr_os_global_mutex */
#define apr_os_global_mutex_get apr_os_proc_mutex_get
#else
    /** Thread and process mutex for those platforms where process mutexes
     *  are not held in threads.
     */
    struct apr_os_global_mutex_t {
        apr_pool_t *pool;
        apr_proc_mutex_t *proc_mutex;
#if APR_HAS_THREADS
        apr_thread_mutex_t *thread_mutex;
#endif /* APR_HAS_THREADS */
    };
    typedef struct apr_os_global_mutex_t apr_os_global_mutex_t;

APR_DECLARE(apr_status_t) apr_os_global_mutex_get(apr_os_global_mutex_t *ospmutex, 
                                                apr_global_mutex_t *pmutex);
#endif


/**
 * convert the file from apr type to os specific type.
 * @param thefile The os specific file we are converting to
 * @param file The apr file to convert.
 * @remark On Unix, it is only possible to get a file descriptor from 
 *         an apr file type.
 */
APR_DECLARE(apr_status_t) apr_os_file_get(apr_os_file_t *thefile,
                                          apr_file_t *file);

/**
 * convert the dir from apr type to os specific type.
 * @param thedir The os specific dir we are converting to
 * @param dir The apr dir to convert.
 */   
APR_DECLARE(apr_status_t) apr_os_dir_get(apr_os_dir_t **thedir, 
                                         apr_dir_t *dir);

/**
 * Convert the socket from an apr type to an OS specific socket
 * @param thesock The socket to convert.
 * @param sock The os specific equivalent of the apr socket..
 */
APR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock,
                                          apr_socket_t *sock);

/**
 * Convert the proc mutex from apr type to os specific type
 * @param ospmutex The os specific proc mutex we are converting to.
 * @param pmutex The apr proc mutex to convert.
 */
APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, 
                                                apr_proc_mutex_t *pmutex);

/**
 * Convert the proc mutex from apr type to os specific type, also
 * providing the mechanism used by the apr mutex.
 * @param ospmutex The os specific proc mutex we are converting to.
 * @param pmutex The apr proc mutex to convert.
 * @param mech The mechanism used by the apr proc mutex (if not NULL).
 * @remark Allows for disambiguation for platforms with multiple mechanisms
 *         available.
 */
APR_DECLARE(apr_status_t) apr_os_proc_mutex_get_ex(apr_os_proc_mutex_t *ospmutex, 
                                                   apr_proc_mutex_t *pmutex,
                                                   apr_lockmech_e *mech);

/**
 * Get the exploded time in the platforms native format.
 * @param ostime the native time format
 * @param aprtime the time to convert
 */
APR_DECLARE(apr_status_t) apr_os_exp_time_get(apr_os_exp_time_t **ostime,
                                 apr_time_exp_t *aprtime);

/**
 * Get the imploded time in the platforms native format.
 * @param ostime  the native time format
 * @param aprtime the time to convert
 */
APR_DECLARE(apr_status_t) apr_os_imp_time_get(apr_os_imp_time_t **ostime, 
                                              apr_time_t *aprtime);

/**
 * convert the shm from apr type to os specific type.
 * @param osshm The os specific shm representation
 * @param shm The apr shm to convert.
 */   
APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm,
                                         apr_shm_t *shm);

#if APR_HAS_THREADS || defined(DOXYGEN)
/** 
 * @defgroup apr_os_thread Thread portability Routines
 * @{ 
 */
/**
 * convert the thread to os specific type from apr type.
 * @param thethd The apr thread to convert
 * @param thd The os specific thread we are converting to
 */
APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, 
                                            apr_thread_t *thd);

/**
 * convert the thread private memory key to os specific type from an apr type.
 * @param thekey The apr handle we are converting from.
 * @param key The os specific handle we are converting to.
 */
APR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey,
                                               apr_threadkey_t *key);

/**
 * convert the thread from os specific type to apr type.
 * @param thd The apr thread we are converting to.
 * @param thethd The os specific thread to convert
 * @param cont The pool to use if it is needed.
 */
APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd,
                                            apr_os_thread_t *thethd,
                                            apr_pool_t *cont);

/**
 * convert the thread private memory key from os specific type to apr type.
 * @param key The apr handle we are converting to.
 * @param thekey The os specific handle to convert
 * @param cont The pool to use if it is needed.
 */
APR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key,
                                               apr_os_threadkey_t *thekey,
                                               apr_pool_t *cont);
/**
 * Get the thread ID
 */
APR_DECLARE(apr_os_thread_t) apr_os_thread_current(void);

/**
 * Compare two thread id's
 * @param tid1 1st Thread ID to compare
 * @param tid2 2nd Thread ID to compare
 * @return non-zero if the two threads are equal, zero otherwise
 */ 
APR_DECLARE(int) apr_os_thread_equal(apr_os_thread_t tid1, 
                                     apr_os_thread_t tid2);

/** @} */
#endif /* APR_HAS_THREADS */

/**
 * convert the file from os specific type to apr type.
 * @param file The apr file we are converting to.
 * @param thefile The os specific file to convert
 * @param flags The flags that were used to open this file.
 * @param cont The pool to use if it is needed.
 * @remark On Unix, it is only possible to put a file descriptor into
 *         an apr file type.
 */
APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file,
                                          apr_os_file_t *thefile,
                                          apr_int32_t flags, apr_pool_t *cont); 

/**
 * convert the file from os specific type to apr type.
 * @param file The apr file we are converting to.
 * @param thefile The os specific pipe to convert
 * @param cont The pool to use if it is needed.
 * @remark On Unix, it is only possible to put a file descriptor into
 *         an apr file type.
 */
APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file,
                                          apr_os_file_t *thefile,
                                          apr_pool_t *cont);

/**
 * convert the file from os specific type to apr type.
 * @param file The apr file we are converting to.
 * @param thefile The os specific pipe to convert
 * @param register_cleanup A cleanup will be registered on the apr_file_t
 *   to issue apr_file_close().
 * @param cont The pool to use if it is needed.
 * @remark On Unix, it is only possible to put a file descriptor into
 *         an apr file type.
 */
APR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file,
                                             apr_os_file_t *thefile,
                                             int register_cleanup,
                                             apr_pool_t *cont);

/**
 * convert the dir from os specific type to apr type.
 * @param dir The apr dir we are converting to.
 * @param thedir The os specific dir to convert
 * @param cont The pool to use when creating to apr directory.
 */
APR_DECLARE(apr_status_t) apr_os_dir_put(apr_dir_t **dir,
                                         apr_os_dir_t *thedir,
                                         apr_pool_t *cont); 

/**
 * Convert a socket from the os specific type to the APR type. If
 * sock points to NULL, a socket will be created from the pool
 * provided. If **sock does not point to NULL, the structure pointed
 * to by sock will be reused and updated with the given socket.
 * @param sock The pool to use.
 * @param thesock The socket to convert to.
 * @param cont The socket we are converting to an apr type.
 * @remark If it is a true socket, it is best to call apr_os_sock_make()
 *         and provide APR with more information about the socket.
 */
APR_DECLARE(apr_status_t) apr_os_sock_put(apr_socket_t **sock, 
                                          apr_os_sock_t *thesock, 
                                          apr_pool_t *cont);

/**
 * Create a socket from an existing descriptor and local and remote
 * socket addresses.
 * @param apr_sock The new socket that has been set up
 * @param os_sock_info The os representation of the socket handle and
 *        other characteristics of the socket
 * @param cont The pool to use
 * @remark If you only know the descriptor/handle or if it isn't really
 *         a true socket, use apr_os_sock_put() instead.
 */
APR_DECLARE(apr_status_t) apr_os_sock_make(apr_socket_t **apr_sock,
                                           apr_os_sock_info_t *os_sock_info,
                                           apr_pool_t *cont);

/**
 * Convert the proc mutex from os specific type to apr type
 * @param pmutex The apr proc mutex we are converting to.
 * @param ospmutex The os specific proc mutex to convert.
 * @param cont The pool to use if it is needed.
 */
APR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex,
                                                apr_os_proc_mutex_t *ospmutex,
                                                apr_pool_t *cont); 

/**
 * Convert the proc mutex from os specific type to apr type, using the
 * specified mechanism.
 * @param pmutex The apr proc mutex we are converting to.
 * @param ospmutex The os specific proc mutex to convert.
 * @param mech The apr mutex locking mechanism
 * @param register_cleanup Whether to destroy the os mutex with the apr
 *        one (either on explicit destroy or pool cleanup).
 * @param cont The pool to use if it is needed.
 * @remark Allows for disambiguation for platforms with multiple mechanisms
 *         available.
 */
APR_DECLARE(apr_status_t) apr_os_proc_mutex_put_ex(apr_proc_mutex_t **pmutex,
                                                apr_os_proc_mutex_t *ospmutex,
                                                apr_lockmech_e mech,
                                                int register_cleanup,
                                                apr_pool_t *cont); 

/**
 * Put the imploded time in the APR format.
 * @param aprtime the APR time format
 * @param ostime the time to convert
 * @param cont the pool to use if necessary
 */
APR_DECLARE(apr_status_t) apr_os_imp_time_put(apr_time_t *aprtime,
                                              apr_os_imp_time_t **ostime,
                                              apr_pool_t *cont); 

/**
 * Put the exploded time in the APR format.
 * @param aprtime the APR time format
 * @param ostime the time to convert
 * @param cont the pool to use if necessary
 */
APR_DECLARE(apr_status_t) apr_os_exp_time_put(apr_time_exp_t *aprtime,
                                              apr_os_exp_time_t **ostime,
                                              apr_pool_t *cont); 

/**
 * convert the shared memory from os specific type to apr type.
 * @param shm The apr shm representation of osshm
 * @param osshm The os specific shm identity
 * @param cont The pool to use if it is needed.
 * @remark On fork()ed architectures, this is typically nothing more than
 * the memory block mapped.  On non-fork architectures, this is typically
 * some internal handle to pass the mapping from process to process.
 */
APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **shm,
                                         apr_os_shm_t *osshm,
                                         apr_pool_t *cont); 


#if APR_HAS_DSO || defined(DOXYGEN)
/** 
 * @defgroup apr_os_dso DSO (Dynamic Loading) Portability Routines
 * @{
 */
/**
 * convert the dso handle from os specific to apr
 * @param dso The apr handle we are converting to
 * @param thedso the os specific handle to convert
 * @param pool the pool to use if it is needed
 */
APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **dso,
                                                apr_os_dso_handle_t thedso,
                                                apr_pool_t *pool);

/**
 * convert the apr dso handle into an os specific one
 * @param aprdso The apr dso handle to convert
 * @param dso The os specific dso to return
 */
APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *dso,
                                                apr_dso_handle_t *aprdso);

/** @} */
#endif /* APR_HAS_DSO */


#if APR_HAS_OS_UUID
/**
 * Private: apr-util's apr_uuid module when supported by the platform
 */
APR_DECLARE(apr_status_t) apr_os_uuid_get(unsigned char *uuid_data);
#endif


/**
 * Get the name of the system default character set.
 * @param pool the pool to allocate the name from, if needed
 */
APR_DECLARE(const char*) apr_os_default_encoding(apr_pool_t *pool);


/**
 * Get the name of the current locale character set.
 * @param pool the pool to allocate the name from, if needed
 * @remark Defers to apr_os_default_encoding() if the current locale's
 * data can't be retrieved on this system.
 */
APR_DECLARE(const char*) apr_os_locale_encoding(apr_pool_t *pool);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_PORTABLE_H */
include/apr-1/apr_memcache.h000064400000041510150336140420011663 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_MEMCACHE_H
#define APR_MEMCACHE_H

/**
 * @file apr_memcache.h
 * @brief Client interface for memcached
 * @remark To use this interface you must have a separate memcached
 * server running. See the memcached website at http://www.danga.com/memcached/
 * for more information.
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_time.h"
#include "apr_strings.h"
#include "apr_network_io.h"
#include "apr_ring.h"
#include "apr_buckets.h"
#include "apr_reslist.h"
#include "apr_hash.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup APR_Util_MC Memcached Client Routines
 * @ingroup APR_Util
 * @{
 */

/** Specifies the status of a memcached server */
typedef enum
{
    APR_MC_SERVER_LIVE, /**< Server is alive and responding to requests */
    APR_MC_SERVER_DEAD  /**< Server is not responding to requests */
} apr_memcache_server_status_t;

/** Opaque memcache client connection object */
typedef struct apr_memcache_conn_t apr_memcache_conn_t;

/** Memcache Server Info Object */
typedef struct apr_memcache_server_t apr_memcache_server_t;
struct apr_memcache_server_t
{
    const char *host; /**< Hostname of this Server */
    apr_port_t port; /**< Port of this Server */
    apr_memcache_server_status_t status; /**< @see apr_memcache_server_status_t */
#if APR_HAS_THREADS || defined(DOXYGEN)
    apr_reslist_t *conns; /**< Resource list of actual client connections */
#else
    apr_memcache_conn_t *conn;
#endif
    apr_pool_t *p; /** Pool to use for private allocations */
#if APR_HAS_THREADS
    apr_thread_mutex_t *lock;
#endif
    apr_time_t btime;
};

/* Custom hash callback function prototype, user for server selection.
* @param baton user selected baton
* @param data data to hash
* @param data_len length of data
*/
typedef apr_uint32_t (*apr_memcache_hash_func)(void *baton,
                                               const char *data,
                                               const apr_size_t data_len);

typedef struct apr_memcache_t apr_memcache_t;

/* Custom Server Select callback function prototype.
* @param baton user selected baton
* @param mc memcache instance, use mc->live_servers to select a node
* @param hash hash of the selected key.
*/
typedef apr_memcache_server_t* (*apr_memcache_server_func)(void *baton,
                                                 apr_memcache_t *mc,
                                                 const apr_uint32_t hash);

/** Container for a set of memcached servers */
struct apr_memcache_t
{
    apr_uint32_t flags; /**< Flags, Not currently used */
    apr_uint16_t nalloc; /**< Number of Servers Allocated */
    apr_uint16_t ntotal; /**< Number of Servers Added */
    apr_memcache_server_t **live_servers; /**< Array of Servers */
    apr_pool_t *p; /** Pool to use for allocations */
    void *hash_baton;
    apr_memcache_hash_func hash_func;
    void *server_baton;
    apr_memcache_server_func server_func;
};

/** Returned Data from a multiple get */
typedef struct
{
    apr_status_t status;
    const char* key;
    apr_size_t len;
    char *data;
    apr_uint16_t flags;
} apr_memcache_value_t;

/**
 * Creates a crc32 hash used to split keys between servers
 * @param mc The memcache client object to use
 * @param data Data to be hashed
 * @param data_len Length of the data to use
 * @return crc32 hash of data
 * @remark The crc32 hash is not compatible with old memcached clients.
 */
APU_DECLARE(apr_uint32_t) apr_memcache_hash(apr_memcache_t *mc,
                                            const char *data,
                                            const apr_size_t data_len);

/**
 * Pure CRC32 Hash. Used by some clients.
 */
APU_DECLARE(apr_uint32_t) apr_memcache_hash_crc32(void *baton,
                                                  const char *data,
                                                  const apr_size_t data_len);

/**
 * hash compatible with the standard Perl Client.
 */
APU_DECLARE(apr_uint32_t) apr_memcache_hash_default(void *baton,
                                                    const char *data,
                                                    const apr_size_t data_len);

/**
 * Picks a server based on a hash
 * @param mc The memcache client object to use
 * @param hash Hashed value of a Key
 * @return server that controls specified hash
 * @see apr_memcache_hash
 */
APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server_hash(apr_memcache_t *mc,
                                                                   const apr_uint32_t hash);

/**
 * server selection compatible with the standard Perl Client.
 */
APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server_hash_default(void *baton,
                                                                           apr_memcache_t *mc, 
                                                                           const apr_uint32_t hash);

/**
 * Adds a server to a client object
 * @param mc The memcache client object to use
 * @param server Server to add
 * @remark Adding servers is not thread safe, and should be done once at startup.
 * @warning Changing servers after startup may cause keys to go to
 * different servers.
 */
APU_DECLARE(apr_status_t) apr_memcache_add_server(apr_memcache_t *mc,
                                                  apr_memcache_server_t *server);


/**
 * Finds a Server object based on a hostname/port pair
 * @param mc The memcache client object to use
 * @param host Hostname of the server
 * @param port Port of the server
 * @return Server with matching Hostname and Port, or NULL if none was found.
 */
APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server(apr_memcache_t *mc,
                                                              const char *host,
                                                              apr_port_t port);

/**
 * Enables a Server for use again
 * @param mc The memcache client object to use
 * @param ms Server to Activate
 */
APU_DECLARE(apr_status_t) apr_memcache_enable_server(apr_memcache_t *mc,
                                                     apr_memcache_server_t *ms);


/**
 * Disable a Server
 * @param mc The memcache client object to use
 * @param ms Server to Disable
 */
APU_DECLARE(apr_status_t) apr_memcache_disable_server(apr_memcache_t *mc,
                                                      apr_memcache_server_t *ms);

/**
 * Creates a new Server Object
 * @param p Pool to use
 * @param host hostname of the server
 * @param port port of the server
 * @param min  minimum number of client sockets to open
 * @param smax soft maximum number of client connections to open
 * @param max  hard maximum number of client connections
 * @param ttl  time to live in microseconds of a client connection
 * @param ns   location of the new server object
 * @see apr_reslist_create
 * @remark min, smax, and max are only used when APR_HAS_THREADS
 */
APU_DECLARE(apr_status_t) apr_memcache_server_create(apr_pool_t *p,
                                                     const char *host,
                                                     apr_port_t port,
                                                     apr_uint32_t min,
                                                     apr_uint32_t smax,
                                                     apr_uint32_t max,
                                                     apr_uint32_t ttl,
                                                     apr_memcache_server_t **ns);
/**
 * Creates a new memcached client object
 * @param p Pool to use
 * @param max_servers maximum number of servers
 * @param flags Not currently used
 * @param mc   location of the new memcache client object
 */
APU_DECLARE(apr_status_t) apr_memcache_create(apr_pool_t *p,
                                              apr_uint16_t max_servers,
                                              apr_uint32_t flags,
                                              apr_memcache_t **mc);

/**
 * Gets a value from the server, allocating the value out of p
 * @param mc client to use
 * @param p Pool to use
 * @param key null terminated string containing the key
 * @param baton location of the allocated value
 * @param len   length of data at baton
 * @param flags any flags set by the client for this key
 * @return 
 */
APU_DECLARE(apr_status_t) apr_memcache_getp(apr_memcache_t *mc, 
                                            apr_pool_t *p,
                                            const char* key,
                                            char **baton,
                                            apr_size_t *len,
                                            apr_uint16_t *flags);


/**
 * Add a key to a hash for a multiget query
 *  if the hash (*value) is NULL it will be created
 * @param data_pool pool from where the hash and their items are created from
 * @param key null terminated string containing the key
 * @param values hash of keys and values that this key will be added to
 * @return
 */
APU_DECLARE(void) apr_memcache_add_multget_key(apr_pool_t *data_pool,
                                               const char* key,
                                               apr_hash_t **values);

/**
 * Gets multiple values from the server, allocating the values out of p
 * @param mc client to use
 * @param temp_pool Pool used for temporary allocations. May be cleared inside this
 *        call.
 * @param data_pool Pool used to allocate data for the returned values.
 * @param values hash of apr_memcache_value_t keyed by strings, contains the
 *        result of the multiget call.
 * @return
 */
APU_DECLARE(apr_status_t) apr_memcache_multgetp(apr_memcache_t *mc,
                                                apr_pool_t *temp_pool,
                                                apr_pool_t *data_pool,
                                                apr_hash_t *values);

/**
 * Sets a value by key on the server
 * @param mc client to use
 * @param key   null terminated string containing the key
 * @param baton data to store on the server
 * @param data_size   length of data at baton
 * @param timeout time in seconds for the data to live on the server
 * @param flags any flags set by the client for this key
 */
APU_DECLARE(apr_status_t) apr_memcache_set(apr_memcache_t *mc,
                                           const char *key,
                                           char *baton,
                                           const apr_size_t data_size,
                                           apr_uint32_t timeout,
                                           apr_uint16_t flags);

/**
 * Adds value by key on the server
 * @param mc client to use
 * @param key   null terminated string containing the key
 * @param baton data to store on the server
 * @param data_size   length of data at baton
 * @param timeout time for the data to live on the server
 * @param flags any flags set by the client for this key
 * @return APR_SUCCESS if the key was added, APR_EEXIST if the key 
 * already exists on the server.
 */
APU_DECLARE(apr_status_t) apr_memcache_add(apr_memcache_t *mc,
                                           const char *key,
                                           char *baton,
                                           const apr_size_t data_size,
                                           apr_uint32_t timeout,
                                           apr_uint16_t flags);

/**
 * Replaces value by key on the server
 * @param mc client to use
 * @param key   null terminated string containing the key
 * @param baton data to store on the server
 * @param data_size   length of data at baton
 * @param timeout time for the data to live on the server
 * @param flags any flags set by the client for this key
 * @return APR_SUCCESS if the key was added, APR_EEXIST if the key 
 * did not exist on the server.
 */
APU_DECLARE(apr_status_t) apr_memcache_replace(apr_memcache_t *mc,
                                               const char *key,
                                               char *baton,
                                               const apr_size_t data_size,
                                               apr_uint32_t timeout,
                                               apr_uint16_t flags);
/**
 * Deletes a key from a server
 * @param mc client to use
 * @param key   null terminated string containing the key
 * @param timeout time for the delete to stop other clients from adding
 */
APU_DECLARE(apr_status_t) apr_memcache_delete(apr_memcache_t *mc,
                                              const char *key,
                                              apr_uint32_t timeout);

/**
 * Increments a value
 * @param mc client to use
 * @param key   null terminated string containing the key
 * @param n     number to increment by
 * @param nv    new value after incrementing
 */
APU_DECLARE(apr_status_t) apr_memcache_incr(apr_memcache_t *mc, 
                                            const char *key,
                                            apr_int32_t n,
                                            apr_uint32_t *nv);

/**
 * Decrements a value
 * @param mc client to use
 * @param key   null terminated string containing the key
 * @param n     number to decrement by
 * @param new_value    new value after decrementing
 */
APU_DECLARE(apr_status_t) apr_memcache_decr(apr_memcache_t *mc, 
                                            const char *key,
                                            apr_int32_t n,
                                            apr_uint32_t *new_value);

/**
 * Query a server's version
 * @param ms    server to query
 * @param p     Pool to allocate answer from
 * @param baton location to store server version string
 * @param len   length of the server version string
 */
APU_DECLARE(apr_status_t) apr_memcache_version(apr_memcache_server_t *ms,
                                               apr_pool_t *p,
                                               char **baton);

typedef struct
{
    /** Version string of this server */
    const char *version;
    /** Process id of this server process */
    apr_uint32_t pid;
    /** Number of seconds this server has been running */
    apr_uint32_t uptime;
    /** current UNIX time according to the server */
    apr_time_t time;
    /** The size of a pointer on the current machine */
    apr_uint32_t pointer_size;
    /** Accumulated user time for this process */
    apr_time_t rusage_user;
    /** Accumulated system time for this process */
    apr_time_t rusage_system;
    /** Current number of items stored by the server */
    apr_uint32_t curr_items;
    /** Total number of items stored by this server */
    apr_uint32_t total_items;
    /** Current number of bytes used by this server to store items */
    apr_uint64_t bytes;
    /** Number of open connections */
    apr_uint32_t curr_connections;
    /** Total number of connections opened since the server started running */
    apr_uint32_t total_connections;
    /** Number of connection structures allocated by the server */
    apr_uint32_t connection_structures;
    /** Cumulative number of retrieval requests */
    apr_uint32_t cmd_get;
    /** Cumulative number of storage requests */
    apr_uint32_t cmd_set;
    /** Number of keys that have been requested and found present */
    apr_uint32_t get_hits;
    /** Number of items that have been requested and not found */
    apr_uint32_t get_misses;
    /** Number of items removed from cache because they passed their
        expiration time */
    apr_uint64_t evictions;
    /** Total number of bytes read by this server */
    apr_uint64_t bytes_read;
    /** Total number of bytes sent by this server */
    apr_uint64_t bytes_written;
    /** Number of bytes this server is allowed to use for storage. */
    apr_uint32_t limit_maxbytes;
    /** Number of threads the server is running (if built with threading) */
    apr_uint32_t threads; 
} apr_memcache_stats_t;

/**
 * Query a server for statistics
 * @param ms    server to query
 * @param p     Pool to allocate answer from
 * @param stats location of the new statistics structure
 */
APU_DECLARE(apr_status_t) apr_memcache_stats(apr_memcache_server_t *ms, 
                                             apr_pool_t *p,
                                             apr_memcache_stats_t **stats);


/** @} */

#ifdef __cplusplus
}
#endif

#endif /* APR_MEMCACHE_H */
include/apr-1/apu_want.h000064400000002713150336140420011077 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "apu.h"        /* configuration data */

/**
 * @file apu_want.h
 * @brief APR Standard Headers Support
 *
 * <PRE>
 * Features:
 *
 *   APU_WANT_DB:       <db.h>
 *
 * Typical usage:
 *
 *   #define APU_WANT_DB
 *   #include "apu_want.h"
 *
 * The appropriate headers will be included.
 *
 * Note: it is safe to use this in a header (it won't interfere with other
 *       headers' or source files' use of apu_want.h)
 * </PRE>
 */

/* --------------------------------------------------------------------- */

#ifdef APU_WANT_DB

#if APU_HAVE_DB
#include <db.h>
#endif

#undef APU_WANT_DB
#endif

/* --------------------------------------------------------------------- */
include/apr-1/apu_version.h000064400000010314150336140420011607 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APU_VERSION_H
#define APU_VERSION_H

/**
 * @file apu_version.h
 * @brief APR-util Versioning Interface
 * 
 * APR-util's Version
 *
 * There are several different mechanisms for accessing the version. There
 * is a string form, and a set of numbers; in addition, there are constants
 * which can be compiled into your application, and you can query the library
 * being used for its actual version.
 *
 * Note that it is possible for an application to detect that it has been
 * compiled against a different version of APU by use of the compile-time
 * constants and the use of the run-time query function.
 *
 * APU version numbering follows the guidelines specified in:
 *
 *     http://apr.apache.org/versioning.html
 */


#define APU_COPYRIGHT "Copyright (c) 2000-2023 The Apache Software " \
                      "Foundation or its licensors, as applicable."

/* The numeric compile-time version constants. These constants are the
 * authoritative version numbers for APU. 
 */

/** major version 
 * Major API changes that could cause compatibility problems for older
 * programs such as structure size changes.  No binary compatibility is
 * possible across a change in the major version.
 */
#define APU_MAJOR_VERSION       1

/** minor version
 * Minor API changes that do not cause binary compatibility problems.
 * Reset to 0 when upgrading APU_MAJOR_VERSION
 */
#define APU_MINOR_VERSION       6

/** patch level 
 * The Patch Level never includes API changes, simply bug fixes.
 * Reset to 0 when upgrading APR_MINOR_VERSION
 */
#define APU_PATCH_VERSION       3

/** 
 * The symbol APU_IS_DEV_VERSION is only defined for internal,
 * "development" copies of APU.  It is undefined for released versions
 * of APU.
 */
/* #undef APU_IS_DEV_VERSION  */


#if defined(APU_IS_DEV_VERSION) || defined(DOXYGEN)
/** Internal: string form of the "is dev" flag */
#ifndef APU_IS_DEV_STRING
#define APU_IS_DEV_STRING "-dev"
#endif
#else
#define APU_IS_DEV_STRING ""
#endif


#ifndef APU_STRINGIFY
/** Properly quote a value as a string in the C preprocessor */
#define APU_STRINGIFY(n) APU_STRINGIFY_HELPER(n)
/** Helper macro for APU_STRINGIFY */
#define APU_STRINGIFY_HELPER(n) #n
#endif

/** The formatted string of APU's version */
#define APU_VERSION_STRING \
     APU_STRINGIFY(APU_MAJOR_VERSION) "." \
     APU_STRINGIFY(APU_MINOR_VERSION) "." \
     APU_STRINGIFY(APU_PATCH_VERSION) \
     APU_IS_DEV_STRING

/** An alternative formatted string of APR's version */
/* macro for Win32 .rc files using numeric csv representation */
#define APU_VERSION_STRING_CSV APU_MAJOR_VERSION ##, \
                             ##APU_MINOR_VERSION ##, \
                             ##APU_PATCH_VERSION


#ifndef APU_VERSION_ONLY

/* The C language API to access the version at run time, 
 * as opposed to compile time.  APU_VERSION_ONLY may be defined 
 * externally when preprocessing apr_version.h to obtain strictly 
 * the C Preprocessor macro declarations.
 */

#include "apr_version.h"

#include "apu.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Return APR-util's version information information in a numeric form.
 *
 *  @param pvsn Pointer to a version structure for returning the version
 *              information.
 */
APU_DECLARE(void) apu_version(apr_version_t *pvsn);

/** Return APU's version information as a string. */
APU_DECLARE(const char *) apu_version_string(void);

#ifdef __cplusplus
}
#endif

#endif /* ndef APU_VERSION_ONLY */

#endif /* ndef APU_VERSION_H */
include/apr-1/apr_queue.h000064400000007760150336140420011256 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_QUEUE_H
#define APR_QUEUE_H

/**
 * @file apr_queue.h
 * @brief Thread Safe FIFO bounded queue
 * @note Since most implementations of the queue are backed by a condition
 * variable implementation, it isn't available on systems without threads.
 * Although condition variables are sometimes available without threads.
 */

#include "apu.h"
#include "apr_errno.h"
#include "apr_pools.h"

#if APR_HAS_THREADS

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup APR_Util_FIFO Thread Safe FIFO bounded queue
 * @ingroup APR_Util
 * @{
 */

/**
 * opaque structure
 */
typedef struct apr_queue_t apr_queue_t;

/** 
 * create a FIFO queue
 * @param queue The new queue
 * @param queue_capacity maximum size of the queue
 * @param a pool to allocate queue from
 */
APU_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **queue, 
                                           unsigned int queue_capacity, 
                                           apr_pool_t *a);

/**
 * push/add an object to the queue, blocking if the queue is already full
 *
 * @param queue the queue
 * @param data the data
 * @returns APR_EINTR the blocking was interrupted (try again)
 * @returns APR_EOF the queue has been terminated
 * @returns APR_SUCCESS on a successful push
 */
APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data);

/**
 * pop/get an object from the queue, blocking if the queue is already empty
 *
 * @param queue the queue
 * @param data the data
 * @returns APR_EINTR the blocking was interrupted (try again)
 * @returns APR_EOF if the queue has been terminated
 * @returns APR_SUCCESS on a successful pop
 */
APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data);

/**
 * push/add an object to the queue, returning immediately if the queue is full
 *
 * @param queue the queue
 * @param data the data
 * @returns APR_EINTR the blocking operation was interrupted (try again)
 * @returns APR_EAGAIN the queue is full
 * @returns APR_EOF the queue has been terminated
 * @returns APR_SUCCESS on a successful push
 */
APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data);

/**
 * pop/get an object to the queue, returning immediately if the queue is empty
 *
 * @param queue the queue
 * @param data the data
 * @returns APR_EINTR the blocking operation was interrupted (try again)
 * @returns APR_EAGAIN the queue is empty
 * @returns APR_EOF the queue has been terminated
 * @returns APR_SUCCESS on a successful pop
 */
APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data);

/**
 * returns the size of the queue.
 *
 * @warning this is not threadsafe, and is intended for reporting/monitoring
 * of the queue.
 * @param queue the queue
 * @returns the size of the queue
 */
APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue);

/**
 * interrupt all the threads blocking on this queue.
 *
 * @param queue the queue
 */
APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue);

/**
 * terminate the queue, sending an interrupt to all the
 * blocking threads
 *
 * @param queue the queue
 */
APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue);

#ifdef __cplusplus
}
#endif

/** @} */

#endif /* APR_HAS_THREADS */

#endif /* APRQUEUE_H */
include/apr-1/apr_escape.h000064400000042356150336140420011372 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file apr_escape.h
 * @brief APR-UTIL Escaping
 */
#ifndef APR_ESCAPE_H
#define APR_ESCAPE_H
#include "apr.h"
#include "apr_general.h"
#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup APR_Util_Escaping Escape functions
 * @ingroup APR
 * @{
 */

/* Simple escape/unescape functions.
 *
 * The design goal of these functions are:
 *
 * - Avoid unnecessary work.
 *
 * In most cases the strings passed in do not need to be escaped at all. In
 * these cases the original string will be returned.
 *
 * - Lowest possible memory footprint.
 *
 * The amount of memory allocated for a given encoding is calculated based
 * on the exact amount of memory needed, and not the theoretical worst case
 * scenario.
 *
 */

/**
 * When passing a string to one of the escape functions, this value can be
 * passed to indicate a string-valued key, and have the length computed
 * automatically.
 */
#define APR_ESCAPE_STRING      (-1)

/**
 * Apply LDAP distinguished name escaping as per RFC4514.
 */
#define APR_ESCAPE_LDAP_DN     (0x01)

/**
 * Apply LDAP filter escaping as per RFC4515.
 */
#define APR_ESCAPE_LDAP_FILTER (0x02)

/**
 * Apply both RFC4514 and RFC4515 LDAP escaping.
 */
#define APR_ESCAPE_LDAP_ALL    (0x03)

/**
 * Perform shell escaping on the provided string.
 * 
 * Shell escaping causes characters to be prefixed with a '\' character.
 * @param escaped Optional buffer to write the encoded string, can be
 * NULL
 * @param str The original string
 * @param slen The length of the original string, or APR_ESCAPE_STRING
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if no changes to the string were
 * detected or the string was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_shell(char *escaped, const char *str,
        apr_ssize_t slen, apr_size_t *len);

/**
 * Perform shell escaping on the provided string, returning the result
 * from the pool.
 *
 * Shell escaping causes characters to be prefixed with a '\' character.
 *
 * If no characters were escaped, the original string is returned.
 * @param p Pool to allocate from
 * @param str The original string
 * @return the encoded string, allocated from the pool, or the original
 * string if no escaping took place or the string was NULL.
 */
APR_DECLARE(const char *) apr_pescape_shell(apr_pool_t *p, const char *str)
        __attribute__((nonnull(1)));

/**
 * Unescapes a URL, leaving reserved characters intact.
 * @param escaped Optional buffer to write the encoded string, can be
 * NULL
 * @param url String to be unescaped
 * @param slen The length of the original url, or APR_ESCAPE_STRING
 * @param forbid Optional list of forbidden characters, in addition to
 * 0x00
 * @param reserved Optional list of reserved characters that will be
 * left unescaped
 * @param plus If non zero, '+' is converted to ' ' as per
 * application/x-www-form-urlencoded encoding
 * @param len If set, the length of the escaped string will be returned
 * @return APR_SUCCESS on success, APR_NOTFOUND if no characters are
 * decoded or the string is NULL, APR_EINVAL if a bad escape sequence is
 * found, APR_BADCH if a character on the forbid list is found.
 */
APR_DECLARE(apr_status_t) apr_unescape_url(char *escaped, const char *url,
        apr_ssize_t slen, const char *forbid, const char *reserved, int plus,
        apr_size_t *len);

/**
 * Unescapes a URL, leaving reserved characters intact, returning the
 * result from a pool.
 * @param p Pool to allocate from
 * @param url String to be unescaped in place
 * @param forbid Optional list of forbidden characters, in addition to
 * 0x00
 * @param reserved Optional list of reserved characters that will be
 * left unescaped
 * @param plus If non zero, '+' is converted to ' ' as per
 * application/x-www-form-urlencoded encoding
 * @return A string allocated from the pool on success, the original string
 * if no characters are decoded, or NULL if a bad escape sequence is found
 * or if a character on the forbid list is found, or if the original string
 * was NULL.
 */
APR_DECLARE(const char *) apr_punescape_url(apr_pool_t *p, const char *url,
        const char *forbid, const char *reserved, int plus)
        __attribute__((nonnull(1)));

/**
 * Escape a path segment, as defined in RFC1808.
 * @param escaped Optional buffer to write the encoded string, can be
 * NULL
 * @param str The original string
 * @param slen The length of the original string, or APR_ESCAPE_STRING
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if no changes to the string were
 * detected or the string was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_path_segment(char *escaped,
        const char *str, apr_ssize_t slen, apr_size_t *len);

/**
 * Escape a path segment, as defined in RFC1808, returning the result from a
 * pool.
 * @param p Pool to allocate from
 * @param str String to be escaped
 * @return A string allocated from the pool on success, the original string
 * if no characters are encoded or the string is NULL.
 */
APR_DECLARE(const char *) apr_pescape_path_segment(apr_pool_t *p,
        const char *str) __attribute__((nonnull(1)));

/**
 * Converts an OS path to a URL, in an OS dependent way, as defined in RFC1808.
 * In all cases if a ':' occurs before the first '/' in the URL, the URL should
 * be prefixed with "./" (or the ':' escaped). In the case of Unix, this means
 * leaving '/' alone, but otherwise doing what escape_path_segment() does. For
 * efficiency reasons, we don't use escape_path_segment(), which is provided for
 * reference. Again, RFC 1808 is where this stuff is defined.
 *
 * If partial is set, os_escape_path() assumes that the path will be appended to
 * something with a '/' in it (and thus does not prefix "./").
 * @param escaped Optional buffer to write the encoded string, can be
 * NULL
 * @param path The original string
 * @param slen The length of the original string, or APR_ESCAPE_STRING
 * @param partial If non zero, suppresses the prepending of "./"
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if no changes to the string were
 * detected or if the string was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_path(char *escaped, const char *path,
        apr_ssize_t slen, int partial, apr_size_t *len);

/**
 * Converts an OS path to a URL, in an OS dependent way, as defined in RFC1808,
 * returning the result from a pool.
 *
 * In all cases if a ':' occurs before the first '/' in the URL, the URL should
 * be prefixed with "./" (or the ':' escaped). In the case of Unix, this means
 * leaving '/' alone, but otherwise doing what escape_path_segment() does. For
 * efficiency reasons, we don't use escape_path_segment(), which is provided for
 * reference. Again, RFC 1808 is where this stuff is defined.
 *
 * If partial is set, os_escape_path() assumes that the path will be appended to
 * something with a '/' in it (and thus does not prefix "./").
 * @param p Pool to allocate from
 * @param str The original string
 * @param partial If non zero, suppresses the prepending of "./"
 * @return A string allocated from the pool on success, the original string
 * if no characters are encoded or if the string was NULL.
 */
APR_DECLARE(const char *) apr_pescape_path(apr_pool_t *p, const char *str,
        int partial) __attribute__((nonnull(1)));

/**
 * Urlencode a string, as defined in
 * http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1.
 * @param escaped Optional buffer to write the encoded string, can be
 * NULL
 * @param str The original string
 * @param slen The length of the original string, or APR_ESCAPE_STRING
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if no changes to the string were
 * detected or if the stirng was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_urlencoded(char *escaped, const char *str,
        apr_ssize_t slen, apr_size_t *len);

/**
 * Urlencode a string, as defined in
 * http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1, returning
 * the result from a pool.
 * @param p Pool to allocate from
 * @param str String to be escaped
 * @return A string allocated from the pool on success, the original string
 * if no characters are encoded or if the string was NULL.
 */
APR_DECLARE(const char *) apr_pescape_urlencoded(apr_pool_t *p,
        const char *str) __attribute__((nonnull(1)));

/**
 * Apply entity encoding to a string. Characters are replaced as follows:
 * '<' becomes '\&lt;', '>' becomes '\&gt;', '&' becomes '\&amp;', the
 * double quote becomes '\&quot;" and the single quote becomes '\&apos;'.
 *
 * If toasc is not zero, any non ascii character will be encoded as
 * '%\#ddd;', where ddd is the decimal code of the character.
 * @param escaped Optional buffer to write the encoded string, can be
 * NULL
 * @param str The original string
 * @param slen The length of the original string, or APR_ESCAPE_STRING
 * @param toasc If non zero, encode non ascii characters
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if no changes to the string were
 * detected or the string was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_entity(char *escaped, const char *str,
        apr_ssize_t slen, int toasc, apr_size_t *len);

/**
 * Apply entity encoding to a string, returning the result from a pool.
 * Characters are replaced as follows: '<' becomes '\&lt;', '>' becomes
 * '\&gt;', '&' becomes '\&amp;', the double quote becomes '\&quot;" and the
 * single quote becomes '\&apos;'.
 * @param p Pool to allocate from
 * @param str The original string
 * @param toasc If non zero, encode non ascii characters
 * @return A string allocated from the pool on success, the original string
 * if no characters are encoded or the string is NULL.
 */
APR_DECLARE(const char *) apr_pescape_entity(apr_pool_t *p, const char *str,
        int toasc) __attribute__((nonnull(1)));

/**
 * Decodes html entities or numeric character references in a string. If
 * the string to be unescaped is syntactically incorrect, then the
 * following fixups will be made:
 * unknown entities will be left undecoded;
 * references to unused numeric characters will be deleted.
 * In particular, &#00; will not be decoded, but will be deleted.
 * @param unescaped Optional buffer to write the encoded string, can be
 * NULL
 * @param str The original string
 * @param slen The length of the original string, or APR_ESCAPE_STRING
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if no changes to the string were
 * detected or the string was NULL
 */
APR_DECLARE(apr_status_t) apr_unescape_entity(char *unescaped, const char *str,
        apr_ssize_t slen, apr_size_t *len);

/**
 * Decodes html entities or numeric character references in a string. If
 * the string to be unescaped is syntactically incorrect, then the
 * following fixups will be made:
 * unknown entities will be left undecoded;
 * references to unused numeric characters will be deleted.
 * In particular, &#00; will not be decoded, but will be deleted.
 * @param p Pool to allocate from
 * @param str The original string
 * @return A string allocated from the pool on success, the original string
 * if no characters are encoded or the string is NULL.
 */
APR_DECLARE(const char *) apr_punescape_entity(apr_pool_t *p, const char *str)
        __attribute__((nonnull(1)));

/**
 * Escape control characters in a string, as performed by the shell's
 * 'echo' command. Characters are replaced as follows:
 * \\a alert (bell), \\b backspace, \\f form feed, \\n new line, \\r carriage
 * return, \\t horizontal tab, \\v vertical tab, \\ backslash.
 *
 * Any non ascii character will be encoded as '\\xHH', where HH is the hex
 * code of the character.
 *
 * If quote is not zero, the double quote character will also be escaped.
 * @param escaped Optional buffer to write the encoded string, can be
 * NULL
 * @param str The original string
 * @param slen The length of the original string, or APR_ESCAPE_STRING
 * @param quote If non zero, encode double quotes
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if no changes to the string were
 * detected or the string was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_echo(char *escaped, const char *str,
        apr_ssize_t slen, int quote, apr_size_t *len);

/**
 * Escape control characters in a string, as performed by the shell's
 * 'echo' command, and return the results from a pool. Characters are
 * replaced as follows: \\a alert (bell), \\b backspace, \\f form feed,
 * \\n new line, \\r carriage return, \\t horizontal tab, \\v vertical tab,
 * \\ backslash.
 *
 * Any non ascii character will be encoded as '\\xHH', where HH is the hex
 * code of the character.
 *
 * If quote is not zero, the double quote character will also be escaped.
 * @param p Pool to allocate from
 * @param str The original string
 * @param quote If non zero, encode double quotes
 * @return A string allocated from the pool on success, the original string
 * if no characters are encoded or the string is NULL.
 */
APR_DECLARE(const char *) apr_pescape_echo(apr_pool_t *p, const char *str,
        int quote);

/**
 * Convert binary data to a hex encoding.
 * @param dest The destination buffer, can be NULL
 * @param src The original buffer
 * @param srclen The length of the original buffer
 * @param colon If not zero, insert colon characters between hex digits.
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if the string was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_hex(char *dest, const void *src,
        apr_size_t srclen, int colon, apr_size_t *len);

/**
 * Convert binary data to a hex encoding, and return the results from a
 * pool.
 * @param p Pool to allocate from
 * @param src The original buffer
 * @param slen The length of the original buffer
 * @param colon If not zero, insert colon characters between hex digits.
 * @return A zero padded buffer allocated from the pool on success, or
 * NULL if src was NULL.
 */
APR_DECLARE(const char *) apr_pescape_hex(apr_pool_t *p, const void *src,
        apr_size_t slen, int colon) __attribute__((nonnull(1)));

/**
 * Convert hex encoded string to binary data.
 * @param dest The destination buffer, can be NULL
 * @param str The original buffer
 * @param slen The length of the original buffer
 * @param colon If not zero, ignore colon characters between hex digits.
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if the string was NULL, or APR_BADCH
 * if a non hex character is present.
 */
APR_DECLARE(apr_status_t) apr_unescape_hex(void *dest, const char *str,
        apr_ssize_t slen, int colon, apr_size_t *len);

/**
 * Convert hex encoding to binary data, and return the results from a pool.
 * If the colon character appears between pairs of hex digits, it will be
 * ignored.
 * @param p Pool to allocate from
 * @param str The original string
 * @param colon If not zero, ignore colon characters between hex digits.
 * @param len If present, returns the length of the final buffer
 * @return A buffer allocated from the pool on success, or NULL if src was
 * NULL, or a bad character was present.
 */
APR_DECLARE(const void *) apr_punescape_hex(apr_pool_t *p, const char *str,
        int colon, apr_size_t *len);

/**
 * Apply LDAP escaping to binary data. Characters from RFC4514 and RFC4515
 * are escaped with their hex equivalents.
 * @param dest The destination buffer, can be NULL
 * @param src The original buffer
 * @param srclen The length of the original buffer
 * @param flags APR_ESCAPE_LDAP_DN for RFC4514, APR_ESCAPE_LDAP_FILTER for
 * RFC4515, APR_ESCAPE_LDAP_ALL for both
 * @param len If present, returns the length of the string
 * @return APR_SUCCESS, or APR_NOTFOUND if the string was NULL
 */
APR_DECLARE(apr_status_t) apr_escape_ldap(char *dest, const void *src,
        apr_ssize_t srclen, int flags, apr_size_t *len);

/**
 * Apply LDAP escaping to binary data, and return the results from a
 * pool. Characters from RFC4514 and RFC4515 are escaped with their hex
 * equivalents.
 * @param p Pool to allocate from
 * @param src The original buffer
 * @param slen The length of the original buffer
 * @param flags APR_ESCAPE_LDAP_DN for RFC4514, APR_ESCAPE_LDAP_FILTER for
 * RFC4515, APR_ESCAPE_LDAP_ALL for both
 * @return A zero padded buffer allocated from the pool on success, or
 * NULL if src was NULL.
 */
APR_DECLARE(const char *) apr_pescape_ldap(apr_pool_t *p, const void *src,
        apr_ssize_t slen, int flags) __attribute__((nonnull(1)));

/** @} */
#ifdef __cplusplus
}
#endif

#endif	/* !APR_ESCAPE_H */
include/apr-1/apr_thread_rwlock.h000064400000011236150336140420012753 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_THREAD_RWLOCK_H
#define APR_THREAD_RWLOCK_H

/**
 * @file apr_thread_rwlock.h
 * @brief APR Reader/Writer Lock Routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#if APR_HAS_THREADS

/**
 * @defgroup apr_thread_rwlock Reader/Writer Lock Routines
 * @ingroup APR 
 * @{
 */

/** Opaque read-write thread-safe lock. */
typedef struct apr_thread_rwlock_t apr_thread_rwlock_t;

/**
 * Note: The following operations have undefined results: unlocking a
 * read-write lock which is not locked in the calling thread; write
 * locking a read-write lock which is already locked by the calling
 * thread; destroying a read-write lock more than once; clearing or
 * destroying the pool from which a <b>locked</b> read-write lock is
 * allocated.
 */

/**
 * Create and initialize a read-write lock that can be used to synchronize
 * threads.
 * @param rwlock the memory address where the newly created readwrite lock
 *        will be stored.
 * @param pool the pool from which to allocate the mutex.
 */
APR_DECLARE(apr_status_t) apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock,
                                                   apr_pool_t *pool);
/**
 * Acquire a shared-read lock on the given read-write lock. This will allow
 * multiple threads to enter the same critical section while they have acquired
 * the read lock.
 * @param rwlock the read-write lock on which to acquire the shared read.
 */
APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock);

/**
 * Attempt to acquire the shared-read lock on the given read-write lock. This
 * is the same as apr_thread_rwlock_rdlock(), only that the function fails
 * if there is another thread holding the write lock, or if there are any
 * write threads blocking on the lock. If the function fails for this case,
 * APR_EBUSY will be returned. Note: it is important that the
 * APR_STATUS_IS_EBUSY(s) macro be used to determine if the return value was
 * APR_EBUSY, for portability reasons.
 * @param rwlock the rwlock on which to attempt the shared read.
 */
APR_DECLARE(apr_status_t) apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock);

/**
 * Acquire an exclusive-write lock on the given read-write lock. This will
 * allow only one single thread to enter the critical sections. If there
 * are any threads currently holding the read-lock, this thread is put to
 * sleep until it can have exclusive access to the lock.
 * @param rwlock the read-write lock on which to acquire the exclusive write.
 */
APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock);

/**
 * Attempt to acquire the exclusive-write lock on the given read-write lock. 
 * This is the same as apr_thread_rwlock_wrlock(), only that the function fails
 * if there is any other thread holding the lock (for reading or writing),
 * in which case the function will return APR_EBUSY. Note: it is important
 * that the APR_STATUS_IS_EBUSY(s) macro be used to determine if the return
 * value was APR_EBUSY, for portability reasons.
 * @param rwlock the rwlock on which to attempt the exclusive write.
 */
APR_DECLARE(apr_status_t) apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock);

/**
 * Release either the read or write lock currently held by the calling thread
 * associated with the given read-write lock.
 * @param rwlock the read-write lock to be released (unlocked).
 */
APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock);

/**
 * Destroy the read-write lock and free the associated memory.
 * @param rwlock the rwlock to destroy.
 */
APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock);

/**
 * Get the pool used by this thread_rwlock.
 * @return apr_pool_t the pool
 */
APR_POOL_DECLARE_ACCESSOR(thread_rwlock);

#endif  /* APR_HAS_THREADS */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_THREAD_RWLOCK_H */
include/apr-1/apr_version.h000064400000012337150336140420011613 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_VERSION_H
#define APR_VERSION_H

/**
 * @file apr_version.h
 * @brief APR Versioning Interface
 * 
 * APR's Version
 *
 * There are several different mechanisms for accessing the version. There
 * is a string form, and a set of numbers; in addition, there are constants
 * which can be compiled into your application, and you can query the library
 * being used for its actual version.
 *
 * Note that it is possible for an application to detect that it has been
 * compiled against a different version of APR by use of the compile-time
 * constants and the use of the run-time query function.
 *
 * APR version numbering follows the guidelines specified in:
 *
 *     http://apr.apache.org/versioning.html
 */


#define APR_COPYRIGHT "Copyright 2025 The Apache Software Foundation."

/* The numeric compile-time version constants. These constants are the
 * authoritative version numbers for APR. 
 */

/** major version 
 * Major API changes that could cause compatibility problems for older
 * programs such as structure size changes.  No binary compatibility is
 * possible across a change in the major version.
 */
#define APR_MAJOR_VERSION       1

/** minor version
 * Minor API changes that do not cause binary compatibility problems.
 * Reset to 0 when upgrading APR_MAJOR_VERSION
 */
#define APR_MINOR_VERSION       7

/** patch level 
 * The Patch Level never includes API changes, simply bug fixes.
 * Reset to 0 when upgrading APR_MINOR_VERSION
 */
#define APR_PATCH_VERSION       6

/** 
 * The symbol APR_IS_DEV_VERSION is only defined for internal,
 * "development" copies of APR.  It is undefined for released versions
 * of APR.
 */
/* #undef APR_IS_DEV_VERSION */

/**
 * Check at compile time if the APR version is at least a certain
 * level.
 * @param major The major version component of the version checked
 * for (e.g., the "1" of "1.3.0").
 * @param minor The minor version component of the version checked
 * for (e.g., the "3" of "1.3.0").
 * @param patch The patch level component of the version checked
 * for (e.g., the "0" of "1.3.0").
 * @remark This macro is available with APR versions starting with
 * 1.3.0.
 */
#define APR_VERSION_AT_LEAST(major,minor,patch)                    \
(((major) < APR_MAJOR_VERSION)                                     \
 || ((major) == APR_MAJOR_VERSION && (minor) < APR_MINOR_VERSION) \
 || ((major) == APR_MAJOR_VERSION && (minor) == APR_MINOR_VERSION && (patch) <= APR_PATCH_VERSION))

#if defined(APR_IS_DEV_VERSION) || defined(DOXYGEN)
/** Internal: string form of the "is dev" flag */
#ifndef APR_IS_DEV_STRING
#define APR_IS_DEV_STRING "-dev"
#endif
#else
#define APR_IS_DEV_STRING ""
#endif

/* APR_STRINGIFY is defined here, and also in apr_general.h, so wrap it */
#ifndef APR_STRINGIFY
/** Properly quote a value as a string in the C preprocessor */
#define APR_STRINGIFY(n) APR_STRINGIFY_HELPER(n)
/** Helper macro for APR_STRINGIFY */
#define APR_STRINGIFY_HELPER(n) #n
#endif

/** The formatted string of APR's version */
#define APR_VERSION_STRING \
     APR_STRINGIFY(APR_MAJOR_VERSION) "." \
     APR_STRINGIFY(APR_MINOR_VERSION) "." \
     APR_STRINGIFY(APR_PATCH_VERSION) \
     APR_IS_DEV_STRING

/** An alternative formatted string of APR's version */
/* macro for Win32 .rc files using numeric csv representation */
#define APR_VERSION_STRING_CSV APR_MAJOR_VERSION ##, \
                             ##APR_MINOR_VERSION ##, \
                             ##APR_PATCH_VERSION


#ifndef APR_VERSION_ONLY

/* The C language API to access the version at run time, 
 * as opposed to compile time.  APR_VERSION_ONLY may be defined 
 * externally when preprocessing apr_version.h to obtain strictly 
 * the C Preprocessor macro declarations.
 */

#include "apr.h"

#ifdef __cplusplus
extern "C" {
#endif

/** 
 * The numeric version information is broken out into fields within this 
 * structure. 
 */
typedef struct {
    int major;      /**< major number */
    int minor;      /**< minor number */
    int patch;      /**< patch number */
    int is_dev;     /**< is development (1 or 0) */
} apr_version_t;

/**
 * Return APR's version information information in a numeric form.
 *
 *  @param pvsn Pointer to a version structure for returning the version
 *              information.
 */
APR_DECLARE(void) apr_version(apr_version_t *pvsn);

/** Return APR's version information as a string. */
APR_DECLARE(const char *) apr_version_string(void);

#ifdef __cplusplus
}
#endif

#endif /* ndef APR_VERSION_ONLY */

#endif /* ndef APR_VERSION_H */
include/apr-1/apr_atomic.h000064400000014054150336140420011400 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_ATOMIC_H
#define APR_ATOMIC_H

/**
 * @file apr_atomic.h
 * @brief APR Atomic Operations
 */

#include "apr.h"
#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup apr_atomic Atomic Operations
 * @ingroup APR 
 * @{
 */

/**
 * this function is required on some platforms to initialize the
 * atomic operation's internal structures
 * @param p pool
 * @return APR_SUCCESS on successful completion
 * @remark Programs do NOT need to call this directly. APR will call this
 *         automatically from apr_initialize().
 * @internal
 */
APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p);

/*
 * Atomic operations on 32-bit values
 * Note: Each of these functions internally implements a memory barrier
 * on platforms that require it
 */

/**
 * atomically read an apr_uint32_t from memory
 * @param mem the pointer
 */
APR_DECLARE(apr_uint32_t) apr_atomic_read32(volatile apr_uint32_t *mem);

/**
 * atomically set an apr_uint32_t in memory
 * @param mem pointer to the object
 * @param val value that the object will assume
 */
APR_DECLARE(void) apr_atomic_set32(volatile apr_uint32_t *mem, apr_uint32_t val);

/**
 * atomically add 'val' to an apr_uint32_t
 * @param mem pointer to the object
 * @param val amount to add
 * @return old value pointed to by mem
 */
APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, apr_uint32_t val);

/**
 * atomically subtract 'val' from an apr_uint32_t
 * @param mem pointer to the object
 * @param val amount to subtract
 */
APR_DECLARE(void) apr_atomic_sub32(volatile apr_uint32_t *mem, apr_uint32_t val);

/**
 * atomically increment an apr_uint32_t by 1
 * @param mem pointer to the object
 * @return old value pointed to by mem
 */
APR_DECLARE(apr_uint32_t) apr_atomic_inc32(volatile apr_uint32_t *mem);

/**
 * atomically decrement an apr_uint32_t by 1
 * @param mem pointer to the atomic value
 * @return zero if the value becomes zero on decrement, otherwise non-zero
 */
APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem);

/**
 * compare an apr_uint32_t's value with 'cmp'.
 * If they are the same swap the value with 'with'
 * @param mem pointer to the value
 * @param with what to swap it with
 * @param cmp the value to compare it to
 * @return the old value of *mem
 */
APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem, apr_uint32_t with,
                              apr_uint32_t cmp);

/**
 * exchange an apr_uint32_t's value with 'val'.
 * @param mem pointer to the value
 * @param val what to swap it with
 * @return the old value of *mem
 */
APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val);

/*
 * Atomic operations on 64-bit values
 * Note: Each of these functions internally implements a memory barrier
 * on platforms that require it
 */

/**
 * atomically read an apr_uint64_t from memory
 * @param mem the pointer
 */
APR_DECLARE(apr_uint64_t) apr_atomic_read64(volatile apr_uint64_t *mem);

/**
 * atomically set an apr_uint64_t in memory
 * @param mem pointer to the object
 * @param val value that the object will assume
 */
APR_DECLARE(void) apr_atomic_set64(volatile apr_uint64_t *mem, apr_uint64_t val);

/**
 * atomically add 'val' to an apr_uint64_t
 * @param mem pointer to the object
 * @param val amount to add
 * @return old value pointed to by mem
 */
APR_DECLARE(apr_uint64_t) apr_atomic_add64(volatile apr_uint64_t *mem, apr_uint64_t val);

/**
 * atomically subtract 'val' from an apr_uint64_t
 * @param mem pointer to the object
 * @param val amount to subtract
 */
APR_DECLARE(void) apr_atomic_sub64(volatile apr_uint64_t *mem, apr_uint64_t val);

/**
 * atomically increment an apr_uint64_t by 1
 * @param mem pointer to the object
 * @return old value pointed to by mem
 */
APR_DECLARE(apr_uint64_t) apr_atomic_inc64(volatile apr_uint64_t *mem);

/**
 * atomically decrement an apr_uint64_t by 1
 * @param mem pointer to the atomic value
 * @return zero if the value becomes zero on decrement, otherwise non-zero
 */
APR_DECLARE(int) apr_atomic_dec64(volatile apr_uint64_t *mem);

/**
 * compare an apr_uint64_t's value with 'cmp'.
 * If they are the same swap the value with 'with'
 * @param mem pointer to the value
 * @param with what to swap it with
 * @param cmp the value to compare it to
 * @return the old value of *mem
 */
APR_DECLARE(apr_uint64_t) apr_atomic_cas64(volatile apr_uint64_t *mem, apr_uint64_t with,
                              apr_uint64_t cmp);

/**
 * exchange an apr_uint64_t's value with 'val'.
 * @param mem pointer to the value
 * @param val what to swap it with
 * @return the old value of *mem
 */
APR_DECLARE(apr_uint64_t) apr_atomic_xchg64(volatile apr_uint64_t *mem, apr_uint64_t val);

/**
 * compare the pointer's value with cmp.
 * If they are the same swap the value with 'with'
 * @param mem pointer to the pointer
 * @param with what to swap it with
 * @param cmp the value to compare it to
 * @return the old value of the pointer
 */
APR_DECLARE(void*) apr_atomic_casptr(volatile void **mem, void *with, const void *cmp);

/**
 * exchange a pair of pointer values
 * @param mem pointer to the pointer
 * @param with what to swap it with
 * @return the old value of the pointer
 */
APR_DECLARE(void*) apr_atomic_xchgptr(volatile void **mem, void *with);

/** @} */

#ifdef __cplusplus
}
#endif

#endif	/* !APR_ATOMIC_H */
include/apr-1/apr_sha1.h000064400000007454150336140420010766 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* NIST Secure Hash Algorithm
 * 	heavily modified by Uwe Hollerbach uh@alumni.caltech edu
 * 	from Peter C. Gutmann's implementation as found in
 * 	Applied Cryptography by Bruce Schneier
 * 	This code is hereby placed in the public domain
 */

#ifndef APR_SHA1_H
#define APR_SHA1_H

#include "apu.h"
#include "apr_general.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @file apr_sha1.h
 * @brief APR-UTIL SHA1 library
 */

/** size of the SHA1 DIGEST */
#define APR_SHA1_DIGESTSIZE 20

/**
 * Define the Magic String prefix that identifies a password as being
 * hashed using our algorithm.
 */
#define APR_SHA1PW_ID "{SHA}"

/** length of the SHA Password */
#define APR_SHA1PW_IDLEN 5

/** @see apr_sha1_ctx_t */
typedef struct apr_sha1_ctx_t apr_sha1_ctx_t;

/** 
 * SHA1 context structure
 */
struct apr_sha1_ctx_t {
    /** message digest */
    apr_uint32_t digest[5];
    /** 64-bit bit counts */
    apr_uint32_t count_lo, count_hi;
    /** SHA data buffer */
    apr_uint32_t data[16];
    /** unprocessed amount in data */
    int local;
};

/**
 * Provide a means to SHA1 crypt/encode a plaintext password in a way which
 * makes password file compatible with those commonly use in netscape web
 * and ldap installations.
 * @param clear The plaintext password
 * @param len The length of the plaintext password
 * @param out The encrypted/encoded password
 * @note SHA1 support is useful for migration purposes, but is less
 *     secure than Apache's password format, since Apache's (MD5)
 *     password format uses a random eight character salt to generate
 *     one of many possible hashes for the same password.  Netscape
 *     uses plain SHA1 without a salt, so the same password
 *     will always generate the same hash, making it easier
 *     to break since the search space is smaller.
 */
APU_DECLARE(void) apr_sha1_base64(const char *clear, int len, char *out);

/**
 * Initialize the SHA digest
 * @param context The SHA context to initialize
 */
APU_DECLARE(void) apr_sha1_init(apr_sha1_ctx_t *context);

/**
 * Update the SHA digest
 * @param context The SHA1 context to update
 * @param input The buffer to add to the SHA digest
 * @param inputLen The length of the input buffer
 */
APU_DECLARE(void) apr_sha1_update(apr_sha1_ctx_t *context, const char *input,
                                unsigned int inputLen);

/**
 * Update the SHA digest with binary data
 * @param context The SHA1 context to update
 * @param input The buffer to add to the SHA digest
 * @param inputLen The length of the input buffer
 */
APU_DECLARE(void) apr_sha1_update_binary(apr_sha1_ctx_t *context,
                                       const unsigned char *input,
                                       unsigned int inputLen);

/**
 * Finish computing the SHA digest
 * @param digest the output buffer in which to store the digest
 * @param context The context to finalize
 */
APU_DECLARE(void) apr_sha1_final(unsigned char digest[APR_SHA1_DIGESTSIZE],
                               apr_sha1_ctx_t *context);

#ifdef __cplusplus
}
#endif

#endif	/* APR_SHA1_H */
include/apr-1/apr_cstr.h000064400000026206150336140420011101 0ustar00/* ====================================================================
 *    Licensed to the Apache Software Foundation (ASF) under one
 *    or more contributor license agreements.  See the NOTICE file
 *    distributed with this work for additional information
 *    regarding copyright ownership.  The ASF licenses this file
 *    to you under the Apache License, Version 2.0 (the
 *    "License"); you may not use this file except in compliance
 *    with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing,
 *    software distributed under the License is distributed on an
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *    KIND, either express or implied.  See the License for the
 *    specific language governing permissions and limitations
 *    under the License.
 * ====================================================================
 */

/**
 * @file apr_cstr.h
 * @brief C string goodies.
 */

#ifndef APR_CSTR_H
#define APR_CSTR_H

#include <apr.h>          /* for apr_size_t */
#include <apr_pools.h>    /* for apr_pool_t */
#include <apr_tables.h>   /* for apr_array_header_t */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_cstr C (POSIX) locale string functions
 * @ingroup apr_strings
 *
 * The apr_cstr_* functions provide traditional C char * string text handling,
 * and notabilty they treat all text in the C (a.k.a. POSIX) locale using the
 * minimal POSIX character set, represented in either ASCII or a corresponding
 * EBCDIC subset.
 *
 * Character values outside of that set are treated as opaque bytes, and all
 * multi-byte character sequences are handled as individual distinct octets.
 *
 * Multi-byte characters sequences whose octets fall in the ASCII range cause
 * unexpected results, such as in the ISO-2022-JP code page where ASCII octets
 * occur within both shift-state and multibyte sequences.
 *
 * In the case of the UTF-8 encoding, all multibyte characters all fall outside
 * of the C/POSIX range of characters, so these functions are generally safe
 * to use on UTF-8 strings. The programmer must be aware that each octet may
 * not represent a distinct printable character in such encodings.
 *
 * The standard C99/POSIX string functions, rather than apr_cstr, should be
 * used in all cases where the current locale and encoding of the text is
 * significant.
 * @{
 */


/** Divide @a input into substrings, interpreting any char from @a sep
 * as a token separator.
 *
 * Return an array of copies of those substrings (plain const char*),
 * allocating both the array and the copies in @a pool.
 *
 * None of the elements added to the array contain any of the
 * characters in @a sep_chars, and none of the new elements are empty
 * (thus, it is possible that the returned array will have length
 * zero).
 *
 * If @a chop_whitespace is TRUE, then remove leading and trailing
 * whitespace from the returned strings.
 *
 * @since New in 1.6
 */
APR_DECLARE(apr_array_header_t *) apr_cstr_split(const char *input,
                                                 const char *sep_chars,
                                                 int chop_whitespace,
                                                 apr_pool_t *pool);

/** Like apr_cstr_split(), but append to existing @a array instead of
 * creating a new one.  Allocate the copied substrings in @a pool
 * (i.e., caller decides whether or not to pass @a array->pool as @a pool).
 *
 * @since New in 1.6
 */
APR_DECLARE(void) apr_cstr_split_append(apr_array_header_t *array,
                                        const char *input,
                                        const char *sep_chars,
                                        int chop_whitespace,
                                        apr_pool_t *pool);


/** Return @c TRUE iff @a str matches any of the elements of @a list, a list
 * of zero or more glob patterns.
 *
 * @since New in 1.6
 */
APR_DECLARE(int) apr_cstr_match_glob_list(const char *str,
                                          const apr_array_header_t *list);

/** Return @c TRUE iff @a str exactly matches any of the elements of @a list.
 *
 * @since New in 1.6
 */
APR_DECLARE(int) apr_cstr_match_list(const char *str,
                                     const apr_array_header_t *list);

/**
 * Get the next token from @a *str interpreting any char from @a sep as a
 * token separator.  Separators at the beginning of @a str will be skipped.
 * Returns a pointer to the beginning of the first token in @a *str or NULL
 * if no token is left.  Modifies @a str such that the next call will return
 * the next token.
 *
 * @note The content of @a *str may be modified by this function.
 *
 * @since New in 1.6.
 */
APR_DECLARE(char *) apr_cstr_tokenize(const char *sep, char **str);

/**
 * Return the number of line breaks in @a msg, allowing any kind of newline
 * termination (CR, LF, CRLF, or LFCR), even inconsistent.
 *
 * @since New in 1.6.
 */
APR_DECLARE(int) apr_cstr_count_newlines(const char *msg);

#if 0 /* XXX: stringbuf logic is not present in APR */
/**
 * Return a cstring which is the concatenation of @a strings (an array
 * of char *) each followed by @a separator (that is, @a separator
 * will also end the resulting string).  Allocate the result in @a pool.
 * If @a strings is empty, then return the empty string.
 *
 * @since New in 1.6.
 */
APR_DECLARE(char *) apr_cstr_join(const apr_array_header_t *strings,
                                  const char *separator,
                                  apr_pool_t *pool);
#endif

/**
 * Perform a case-insensitive comparison of two strings @a atr1 and @a atr2,
 * treating upper and lower case values of the 26 standard C/POSIX alphabetic
 * characters as equivalent. Extended latin characters outside of this set
 * are treated as unique octets, irrespective of the current locale.
 *
 * Returns in integer greater than, equal to, or less than 0,
 * according to whether @a str1 is considered greater than, equal to,
 * or less than @a str2.
 *
 * @since New in 1.6.
 */
APR_DECLARE(int) apr_cstr_casecmp(const char *str1, const char *str2);

/**
 * Perform a case-insensitive comparison of two strings @a atr1 and @a atr2,
 * treating upper and lower case values of the 26 standard C/POSIX alphabetic
 * characters as equivalent. Extended latin characters outside of this set
 * are treated as unique octets, irrespective of the current locale.
 *
 * Returns in integer greater than, equal to, or less than 0,
 * according to whether @a str1 is considered greater than, equal to,
 * or less than @a str2.
 *
 * @since New in 1.6.
 */
APR_DECLARE(int) apr_cstr_casecmpn(const char *str1,
                                   const char *str2,
                                   apr_size_t n);

/**
 * Parse the C string @a str into a 64 bit number, and return it in @a *n.
 * Assume that the number is represented in base @a base.
 * Raise an error if conversion fails (e.g. due to overflow), or if the
 * converted number is smaller than @a minval or larger than @a maxval.
 *
 * Leading whitespace in @a str is skipped in a locale-dependent way.
 * After that, the string may contain an optional '+' (positive, default)
 * or '-' (negative) character, followed by an optional '0x' prefix if
 * @a base is 0 or 16, followed by numeric digits appropriate for the base.
 * If there are any more characters after the numeric digits, an error is
 * returned.
 *
 * If @a base is zero, then a leading '0x' or '0X' prefix means hexadecimal,
 * else a leading '0' means octal (implemented, though not documented, in
 * apr_strtoi64() in APR 0.9.0 through 1.5.0), else use base ten.
 *
 * @since New in 1.6.
 */
APR_DECLARE(apr_status_t) apr_cstr_strtoi64(apr_int64_t *n, const char *str,
                                            apr_int64_t minval,
                                            apr_int64_t maxval,
                                            int base);

/**
 * Parse the C string @a str into a 64 bit number, and return it in @a *n.
 * Assume that the number is represented in base 10.
 * Raise an error if conversion fails (e.g. due to overflow).
 *
 * The behaviour otherwise is as described for apr_cstr_strtoi64().
 *
 * @since New in 1.6.
 */
APR_DECLARE(apr_status_t) apr_cstr_atoi64(apr_int64_t *n, const char *str);

/**
 * Parse the C string @a str into a 32 bit number, and return it in @a *n.
 * Assume that the number is represented in base 10.
 * Raise an error if conversion fails (e.g. due to overflow).
 *
 * The behaviour otherwise is as described for apr_cstr_strtoi64().
 *
 * @since New in 1.6.
 */
APR_DECLARE(apr_status_t) apr_cstr_atoi(int *n, const char *str);

/**
 * Parse the C string @a str into an unsigned 64 bit number, and return
 * it in @a *n. Assume that the number is represented in base @a base.
 * Raise an error if conversion fails (e.g. due to overflow), or if the
 * converted number is smaller than @a minval or larger than @a maxval.
 *
 * Leading whitespace in @a str is skipped in a locale-dependent way.
 * After that, the string may contain an optional '+' (positive, default)
 * or '-' (negative) character, followed by an optional '0x' prefix if
 * @a base is 0 or 16, followed by numeric digits appropriate for the base.
 * If there are any more characters after the numeric digits, an error is
 * returned.
 *
 * If @a base is zero, then a leading '0x' or '0X' prefix means hexadecimal,
 * else a leading '0' means octal (as implemented, though not documented, in
 * apr_strtoi64(), else use base ten.
 *
 * @warning The implementation returns APR_ERANGE if the parsed number
 * is greater than APR_INT64_MAX, even if it is not greater than @a maxval.
 *
 * @since New in 1.6.
 */
APR_DECLARE(apr_status_t) apr_cstr_strtoui64(apr_uint64_t *n, const char *str,
                                             apr_uint64_t minval,
                                             apr_uint64_t maxval,
                                             int base);

/**
 * Parse the C string @a str into an unsigned 64 bit number, and return
 * it in @a *n. Assume that the number is represented in base 10.
 * Raise an error if conversion fails (e.g. due to overflow).
 *
 * The behaviour otherwise is as described for apr_cstr_strtoui64(),
 * including the upper limit of APR_INT64_MAX.
 *
 * @since New in 1.6.
 */
APR_DECLARE(apr_status_t) apr_cstr_atoui64(apr_uint64_t *n, const char *str);

/**
 * Parse the C string @a str into an unsigned 32 bit number, and return
 * it in @a *n. Assume that the number is represented in base 10.
 * Raise an error if conversion fails (e.g. due to overflow).
 *
 * The behaviour otherwise is as described for apr_cstr_strtoui64(),
 * including the upper limit of APR_INT64_MAX.
 *
 * @since New in 1.6.
 */
APR_DECLARE(apr_status_t) apr_cstr_atoui(unsigned int *n, const char *str);

/**
 * Skip the common prefix @a prefix from the C string @a str, and return
 * a pointer to the next character after the prefix.
 * Return @c NULL if @a str does not start with @a prefix.
 *
 * @since New in 1.6.
 */
APR_DECLARE(const char *) apr_cstr_skip_prefix(const char *str,
                                               const char *prefix);

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif  /* SVN_STRING_H */
include/apr-1/apr_support.h000064400000003142150336140420011634 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_SUPPORT_H
#define APR_SUPPORT_H

/**
 * @file apr_support.h
 * @brief APR Support functions
 */

#include "apr.h"
#include "apr_network_io.h"
#include "apr_file_io.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_support Internal APR support functions
 * @ingroup APR 
 * @{
 */

/**
 * Wait for IO to occur or timeout.
 *
 * @param f The file to wait on.
 * @param s The socket to wait on if @a f is @c NULL.
 * @param for_read If non-zero wait for data to be available to read,
 *        otherwise wait for data to be able to be written. 
 * @return APR_TIMEUP if we run out of time.
 */
apr_status_t apr_wait_for_io_or_timeout(apr_file_t *f, apr_socket_t *s,
                                        int for_read);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_SUPPORT_H */
include/apr-1/apr_skiplist.h000064400000034305150336140420011767 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_SKIPLIST_H
#define APR_SKIPLIST_H
/**
 * @file apr_skiplist.h
 * @brief APR skip list implementation
 */

#include "apr.h"
#include "apr_portable.h"
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_skiplist Skip list implementation
 * Refer to http://en.wikipedia.org/wiki/Skip_list for information
 * about the purpose of and ideas behind skip lists.
 * @ingroup APR
 * @{
 */

/**
 * apr_skiplist_compare is the function type that must be implemented 
 * per object type that is used in a skip list for comparisons to maintain
 * order
 * */
typedef int (*apr_skiplist_compare) (void *, void *);

/**
 * apr_skiplist_freefunc is the function type that must be implemented
 * to handle elements as they are removed from a skip list.
 */
typedef void (*apr_skiplist_freefunc) (void *);

/** Opaque structure used to represent the skip list */
struct apr_skiplist;
/** Opaque structure used to represent the skip list */
typedef struct apr_skiplist apr_skiplist;

/** 
 * Opaque structure used to represent abstract nodes in the skip list
 * (an abstraction above the raw elements which are collected in the
 * skip list).
 */
struct apr_skiplistnode;
/** Opaque structure */
typedef struct apr_skiplistnode apr_skiplistnode;

/**
 * Allocate memory using the same mechanism as the skip list.
 * @param sl The skip list
 * @param size The amount to allocate
 * @remark If a pool was provided to apr_skiplist_init(), memory will
 * be allocated from the pool or from a free list maintained with
 * the skip list.  Otherwise, memory will be allocated using the
 * C standard library heap functions.
 */
APR_DECLARE(void *) apr_skiplist_alloc(apr_skiplist *sl, size_t size);

/**
 * Free memory using the same mechanism as the skip list.
 * @param sl The skip list
 * @param mem The object to free
 * @remark If a pool was provided to apr_skiplist_init(), memory will
 * be added to a free list maintained with the skip list and be available
 * to operations on the skip list or to other calls to apr_skiplist_alloc().
 * Otherwise, memory will be freed using the  C standard library heap
 * functions.
 */
APR_DECLARE(void) apr_skiplist_free(apr_skiplist *sl, void *mem);

/**
 * Allocate a new skip list
 * @param sl The pointer in which to return the newly created skip list
 * @param p The pool from which to allocate the skip list (optional).
 * @remark Unlike most APR functions, a pool is optional.  If no pool
 * is provided, the C standard library heap functions will be used instead.
 */
APR_DECLARE(apr_status_t) apr_skiplist_init(apr_skiplist **sl, apr_pool_t *p);

/**
 * Set the comparison functions to be used for searching the skip list.
 * @param sl The skip list
 * @param XXX1 FIXME
 * @param XXX2 FIXME
 *
 * @remark If existing comparison functions are being replaced, the index
 * will be replaced during this call.  That is a potentially expensive
 * operation.
 */
APR_DECLARE(void) apr_skiplist_set_compare(apr_skiplist *sl, apr_skiplist_compare XXX1,
                             apr_skiplist_compare XXX2);

/**
 * Set the indexing functions to the specified comparison functions and
 * rebuild the index.
 * @param sl The skip list
 * @param XXX1 FIXME
 * @param XXX2 FIXME
 *
 * @remark If an index already exists, it will not be replaced and the
 * comparison functions will not be changed.
 */
APR_DECLARE(void) apr_skiplist_add_index(apr_skiplist *sl, apr_skiplist_compare XXX1,
                        apr_skiplist_compare XXX2);

/**
 * Return the list maintained by the skip list abstraction.
 * @param sl The skip list
 */
APR_DECLARE(apr_skiplistnode *) apr_skiplist_getlist(apr_skiplist *sl);

/**
 * Return the next matching element in the skip list using the specified
 * comparison function.
 * @param sl The skip list
 * @param data The value to search for
 * @param iter A pointer to the returned skip list node representing the element
 * found
 * @param func The comparison function to use
 */
APR_DECLARE(void *) apr_skiplist_find_compare(apr_skiplist *sl,
                               void *data,
                               apr_skiplistnode **iter,
                               apr_skiplist_compare func);

/**
 * Return the next matching element in the skip list using the current comparison
 * function.
 * @param sl The skip list
 * @param data The value to search for
 * @param iter A pointer to the returned skip list node representing the element
 * found
 */
APR_DECLARE(void *) apr_skiplist_find(apr_skiplist *sl, void *data, apr_skiplistnode **iter);

/**
 * Return the last matching element in the skip list using the specified
 * comparison function.
 * @param sl The skip list
 * @param data The value to search for
 * @param iter A pointer to the returned skip list node representing the element
 * found
 * @param comp The comparison function to use
 */
APR_DECLARE(void *) apr_skiplist_last_compare(apr_skiplist *sl, void *data,
                                              apr_skiplistnode **iter,
                                              apr_skiplist_compare comp);

/**
 * Return the last matching element in the skip list using the current comparison
 * function.
 * @param sl The skip list
 * @param data The value to search for
 * @param iter A pointer to the returned skip list node representing the element
 * found
 */
APR_DECLARE(void *) apr_skiplist_last(apr_skiplist *sl, void *data,
                                      apr_skiplistnode **iter);

/**
 * Return the next element in the skip list.
 * @param sl The skip list
 * @param iter On entry, a pointer to the skip list node to start with; on return,
 * a pointer to the skip list node representing the element returned
 * @remark If iter points to a NULL value on entry, NULL will be returned.
 */
APR_DECLARE(void *) apr_skiplist_next(apr_skiplist *sl, apr_skiplistnode **iter);

/**
 * Return the previous element in the skip list.
 * @param sl The skip list
 * @param iter On entry, a pointer to the skip list node to start with; on return,
 * a pointer to the skip list node representing the element returned
 * @remark If iter points to a NULL value on entry, NULL will be returned.
 */
APR_DECLARE(void *) apr_skiplist_previous(apr_skiplist *sl, apr_skiplistnode **iter);

/**
 * Return the element of the skip list node
 * @param iter The skip list node
 */
APR_DECLARE(void *) apr_skiplist_element(apr_skiplistnode *iter);

/**
 * Insert an element into the skip list using the specified comparison function
 * if it does not already exist.
 * @param sl The skip list
 * @param data The element to insert
 * @param comp The comparison function to use for placement into the skip list
 */
APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl,
                                          void *data, apr_skiplist_compare comp);

/**
 * Insert an element into the skip list using the existing comparison function
 * if it does not already exist.
 * @param sl The skip list
 * @param data The element to insert
 * @remark If no comparison function has been set for the skip list, the element
 * will not be inserted and NULL will be returned.
 */
APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert(apr_skiplist* sl, void *data);

/**
 * Add an element into the skip list using the specified comparison function
 * allowing for duplicates.
 * @param sl The skip list
 * @param data The element to add
 * @param comp The comparison function to use for placement into the skip list
 */
APR_DECLARE(apr_skiplistnode *) apr_skiplist_add_compare(apr_skiplist *sl,
                                          void *data, apr_skiplist_compare comp);

/**
 * Add an element into the skip list using the existing comparison function
 * allowing for duplicates.
 * @param sl The skip list
 * @param data The element to insert
 * @remark If no comparison function has been set for the skip list, the element
 * will not be inserted and NULL will be returned.
 */
APR_DECLARE(apr_skiplistnode *) apr_skiplist_add(apr_skiplist* sl, void *data);

/**
 * Add an element into the skip list using the specified comparison function
 * removing the existing duplicates.
 * @param sl The skip list
 * @param data The element to insert
 * @param comp The comparison function to use for placement into the skip list
 * @param myfree A function to be called for each removed duplicate
 * @remark If no comparison function has been set for the skip list, the element
 * will not be inserted, none will be replaced, and NULL will be returned.
 */
APR_DECLARE(apr_skiplistnode *) apr_skiplist_replace_compare(apr_skiplist *sl,
                                    void *data, apr_skiplist_freefunc myfree,
                                    apr_skiplist_compare comp);

/**
 * Add an element into the skip list using the existing comparison function
 * removing the existing duplicates.
 * @param sl The skip list
 * @param data The element to insert
 * @param myfree A function to be called for each removed duplicate
 * @remark If no comparison function has been set for the skip list, the element
 * will not be inserted, none will be replaced, and NULL will be returned.
 */
APR_DECLARE(apr_skiplistnode *) apr_skiplist_replace(apr_skiplist *sl,
                                    void *data, apr_skiplist_freefunc myfree);

/**
 * Remove a node from the skip list.
 * @param sl The skip list
 * @param iter The skip list node to remove
 * @param myfree A function to be called for the removed element
 */
APR_DECLARE(int) apr_skiplist_remove_node(apr_skiplist *sl,
                                          apr_skiplistnode *iter,
                                          apr_skiplist_freefunc myfree);

/**
 * Remove an element from the skip list using the specified comparison function for
 * locating the element. In the case of duplicates, the 1st entry will be removed.
 * @param sl The skip list
 * @param data The element to remove
 * @param myfree A function to be called for each removed element
 * @param comp The comparison function to use for placement into the skip list
 * @remark If the element is not found, 0 will be returned.  Otherwise, the heightXXX
 * will be returned.
 */
APR_DECLARE(int) apr_skiplist_remove_compare(apr_skiplist *sl, void *data,
                               apr_skiplist_freefunc myfree, apr_skiplist_compare comp);

/**
 * Remove an element from the skip list using the existing comparison function for
 * locating the element. In the case of duplicates, the 1st entry will be removed.
 * @param sl The skip list
 * @param data The element to remove
 * @param myfree A function to be called for each removed element
 * @remark If the element is not found, 0 will be returned.  Otherwise, the heightXXX
 * will be returned.
 * @remark If no comparison function has been set for the skip list, the element
 * will not be removed and 0 will be returned.
 */
APR_DECLARE(int) apr_skiplist_remove(apr_skiplist *sl, void *data, apr_skiplist_freefunc myfree);

/**
 * Remove all elements from the skip list.
 * @param sl The skip list
 * @param myfree A function to be called for each removed element
 */
APR_DECLARE(void) apr_skiplist_remove_all(apr_skiplist *sl, apr_skiplist_freefunc myfree);

/**
 * Remove each element from the skip list.
 * @param sl The skip list
 * @param myfree A function to be called for each removed element
 */
APR_DECLARE(void) apr_skiplist_destroy(apr_skiplist *sl, apr_skiplist_freefunc myfree);

/**
 * Return the first element in the skip list, removing the element from the skip list.
 * @param sl The skip list
 * @param myfree A function to be called for the removed element
 * @remark NULL will be returned if there are no elements
 */
APR_DECLARE(void *) apr_skiplist_pop(apr_skiplist *sl, apr_skiplist_freefunc myfree);

/**
 * Return the first element in the skip list, leaving the element in the skip list.
 * @param sl The skip list
 * @remark NULL will be returned if there are no elements
 */
APR_DECLARE(void *) apr_skiplist_peek(apr_skiplist *sl);

/**
 * Return the size of the list (number of elements), in O(1).
 * @param sl The skip list
 */
APR_DECLARE(size_t) apr_skiplist_size(const apr_skiplist *sl);

/**
 * Return the height of the list (number of skip paths), in O(1).
 * @param sl The skip list
 */
APR_DECLARE(int) apr_skiplist_height(const apr_skiplist *sl);

/**
 * Return the predefined maximum height of the skip list.
 * @param sl The skip list
 */
APR_DECLARE(int) apr_skiplist_preheight(const apr_skiplist *sl);

/**
 * Set a predefined maximum height for the skip list.
 * @param sl The skip list
 * @param to The preheight to set, or a nul/negative value to disable.
 * @remark When a preheight is used, the height of each inserted element is
 * computed randomly up to this preheight instead of the current skip list's
 * height plus one used by the default implementation. Using a preheight can
 * probably ensure more fairness with long living elements (since with an
 * adaptative height, former elements may have been created with a low height,
 * hence a longest path to reach them while the skip list grows). On the other
 * hand, the default behaviour (preheight <= 0) with a growing and decreasing
 * maximum height is more adaptative/suitable for short living values.
 * @note Should be called before any insertion/add.
 */
APR_DECLARE(void) apr_skiplist_set_preheight(apr_skiplist *sl, int to);

/**
 * Merge two skip lists.  XXX SEMANTICS
 * @param sl1 One of two skip lists to be merged
 * @param sl2 The other of two skip lists to be merged
 */
APR_DECLARE(apr_skiplist *) apr_skiplist_merge(apr_skiplist *sl1, apr_skiplist *sl2);

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* ! APR_SKIPLIST_H */
include/apr-1/apr_ldap_init.h000064400000013224150336140420012065 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file apr_ldap_init.h
 * @brief  APR-UTIL LDAP ldap_init() functions
 */
#ifndef APR_LDAP_INIT_H
#define APR_LDAP_INIT_H

/**
 * @addtogroup APR_Util_LDAP
 * @{
 */

#include "apr_ldap.h"

#if APR_HAS_LDAP

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


/**
 * Macro to detect security related return values.
 */
#if defined(LDAP_INSUFFICIENT_ACCESS)
#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_ACCESS
#elif defined(LDAP_INSUFFICIENT_RIGHTS)
#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_RIGHTS
#elif defined(APR_HAS_MICROSOFT_LDAPSDK)
/* The macros above fail to contemplate that LDAP_RETCODE values
 * may be represented by an enum.  autoconf tests would be much
 * more robust.
 */
#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_RIGHTS
#else
#error The security return codes must be added to support this LDAP toolkit.
#endif

#if defined(LDAP_SECURITY_ERROR)
#define APU_LDAP_SECURITY_ERROR LDAP_SECURITY_ERROR
#else
#define APU_LDAP_SECURITY_ERROR(n)	\
    (LDAP_INAPPROPRIATE_AUTH == n) ? 1 \
    : (LDAP_INVALID_CREDENTIALS == n) ? 1 \
    : (APU_LDAP_INSUFFICIENT_ACCESS == n) ? 1 \
    : 0
#endif


/**
 * APR LDAP SSL Initialise function
 *
 * This function initialises SSL on the underlying LDAP toolkit
 * if this is necessary.
 *
 * If a CA certificate is provided, this is set, however the setting
 * of certificates via this method has been deprecated and will be removed in
 * APR v2.0.
 *
 * The apr_ldap_set_option() function with the APR_LDAP_OPT_TLS_CERT option
 * should be used instead to set certificates.
 *
 * If SSL support is not available on this platform, or a problem
 * was encountered while trying to set the certificate, the function
 * will return APR_EGENERAL. Further LDAP specific error information
 * can be found in result_err.
 * @param pool The pool to use
 * @param cert_auth_file The name of the certificate to use, can be NULL
 * @param cert_file_type The type of certificate specified. See the
 * apr_ldap_set_option() APR_LDAP_OPT_TLS_CERT option for details.
 * @param result_err The returned result
 */
APU_DECLARE_LDAP(int) apr_ldap_ssl_init(apr_pool_t *pool,
                                        const char *cert_auth_file,
                                        int cert_file_type,
                                        apr_ldap_err_t **result_err);

/**
 * APR LDAP SSL De-Initialise function
 *
 * This function tears down any SSL certificate setup previously
 * set using apr_ldap_ssl_init(). It should be called to clean
 * up if a graceful restart of a service is attempted.
 * @todo currently we do not check whether apr_ldap_ssl_init()
 * has been called first - we probably should.
 */
APU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void);

/**
 * APR LDAP initialise function
 *
 * This function is responsible for initialising an LDAP
 * connection in a toolkit independant way. It does the
 * job of ldap_init() from the C api.
 *
 * It handles both the SSL and non-SSL case, and attempts
 * to hide the complexity setup from the user. This function
 * assumes that any certificate setup necessary has already
 * been done.
 *
 * If SSL or STARTTLS needs to be enabled, and the underlying
 * toolkit supports it, the following values are accepted for
 * secure:
 *
 * APR_LDAP_NONE: No encryption
 * APR_LDAP_SSL: SSL encryption (ldaps://)
 * APR_LDAP_STARTTLS: Force STARTTLS on ldap://
 * @remark The Novell toolkit is only able to set the SSL mode via this
 * function. To work around this limitation, set the SSL mode here if no
 * per connection client certificates are present, otherwise set secure
 * APR_LDAP_NONE here, then set the per connection client certificates,
 * followed by setting the SSL mode via apr_ldap_set_option(). As Novell
 * does not support per connection client certificates, this problem is
 * worked around while still being compatible with other LDAP toolkits.
 * @param pool The pool to use
 * @param ldap The LDAP handle
 * @param hostname The name of the host to connect to. This can be either a
 * DNS name, or an IP address.
 * @param portno The port to connect to
 * @param secure The security mode to set
 * @param result_err The returned result
 */
APU_DECLARE_LDAP(int) apr_ldap_init(apr_pool_t *pool,
                                    LDAP **ldap,
                                    const char *hostname,
                                    int portno,
                                    int secure,
                                    apr_ldap_err_t **result_err);

/**
 * APR LDAP info function
 *
 * This function returns a string describing the LDAP toolkit
 * currently in use. The string is placed inside result_err->reason.
 * @param pool The pool to use
 * @param result_err The returned result
 */
APU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
                                    apr_ldap_err_t **result_err);

#ifdef __cplusplus
}
#endif

#endif /* APR_HAS_LDAP */

/** @} */

#endif /* APR_LDAP_URL_H */
include/apr-1/apr_poll.h000064400000051153150336140420011073 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_POLL_H
#define APR_POLL_H
/**
 * @file apr_poll.h
 * @brief APR Poll interface
 */
#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_inherit.h" 
#include "apr_file_io.h" 
#include "apr_network_io.h" 

#if APR_HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_poll Poll Routines
 * @ingroup APR 
 * @{
 */

/**
 * @defgroup pollopts Poll options
 * @ingroup apr_poll
 * @{
 */
#define APR_POLLIN    0x001     /**< Can read without blocking */
#define APR_POLLPRI   0x002     /**< Priority data available */
#define APR_POLLOUT   0x004     /**< Can write without blocking */
#define APR_POLLERR   0x010     /**< Pending error */
#define APR_POLLHUP   0x020     /**< Hangup occurred */
#define APR_POLLNVAL  0x040     /**< Descriptor invalid */
/** @} */

/**
 * @defgroup pollflags Pollset Flags
 * @ingroup apr_poll
 * @{
 */
#define APR_POLLSET_THREADSAFE 0x001 /**< Adding or removing a descriptor is
                                      * thread-safe
                                      */
#define APR_POLLSET_NOCOPY     0x002 /**< Descriptors passed to apr_pollset_add()
                                      * are not copied
                                      */
#define APR_POLLSET_WAKEABLE   0x004 /**< Poll operations are interruptable by
                                      * apr_pollset_wakeup() or apr_pollcb_wakeup()
                                      */
#define APR_POLLSET_NODEFAULT  0x010 /**< Do not try to use the default method if
                                      * the specified non-default method cannot be
                                      * used
                                      */
/** @} */

/**
 * Pollset Methods
 */
typedef enum {
    APR_POLLSET_DEFAULT,        /**< Platform default poll method */
    APR_POLLSET_SELECT,         /**< Poll uses select method */
    APR_POLLSET_KQUEUE,         /**< Poll uses kqueue method */
    APR_POLLSET_PORT,           /**< Poll uses Solaris event port method */
    APR_POLLSET_EPOLL,          /**< Poll uses epoll method */
    APR_POLLSET_POLL,           /**< Poll uses poll method */
    APR_POLLSET_AIO_MSGQ        /**< Poll uses z/OS asio method */
} apr_pollset_method_e;

/** Used in apr_pollfd_t to determine what the apr_descriptor is */
typedef enum { 
    APR_NO_DESC,                /**< nothing here */
    APR_POLL_SOCKET,            /**< descriptor refers to a socket */
    APR_POLL_FILE,              /**< descriptor refers to a file */
    APR_POLL_LASTDESC           /**< @deprecated descriptor is the last one in the list */
} apr_datatype_e ;

/** Union of either an APR file or socket. */
typedef union {
    apr_file_t *f;              /**< file */
    apr_socket_t *s;            /**< socket */
} apr_descriptor;

/** @see apr_pollfd_t */
typedef struct apr_pollfd_t apr_pollfd_t;

/** Poll descriptor set. */
struct apr_pollfd_t {
    apr_pool_t *p;              /**< associated pool */
    apr_datatype_e desc_type;   /**< descriptor type */
    apr_int16_t reqevents;      /**< requested events */
    apr_int16_t rtnevents;      /**< returned events */
    apr_descriptor desc;        /**< @see apr_descriptor */
    void *client_data;          /**< allows app to associate context */
};


/* General-purpose poll API for arbitrarily large numbers of
 * file descriptors
 */

/** Opaque structure used for pollset API */
typedef struct apr_pollset_t apr_pollset_t;

/**
 * Set up a pollset object
 * @param pollset  The pointer in which to return the newly created object 
 * @param size The maximum number of descriptors that this pollset can hold
 * @param p The pool from which to allocate the pollset
 * @param flags Optional flags to modify the operation of the pollset.
 *
 * @remark If flags contains APR_POLLSET_THREADSAFE, then a pollset is
 *         created on which it is safe to make concurrent calls to
 *         apr_pollset_add(), apr_pollset_remove() and apr_pollset_poll()
 *         from separate threads.  This feature is only supported on some
 *         platforms; the apr_pollset_create() call will fail with
 *         APR_ENOTIMPL on platforms where it is not supported.
 * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollset is
 *         created with an additional internal pipe object used for the
 *         apr_pollset_wakeup() call. The actual size of pollset is
 *         in that case @a size + 1. This feature is only supported on some
 *         platforms; the apr_pollset_create() call will fail with
 *         APR_ENOTIMPL on platforms where it is not supported.
 * @remark If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t
 *         structures passed to apr_pollset_add() are not copied and
 *         must have a lifetime at least as long as the pollset.
 * @remark Some poll methods (including APR_POLLSET_KQUEUE,
 *         APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a
 *         fixed limit on the size of the pollset. For these methods,
 *         the size parameter controls the maximum number of
 *         descriptors that will be returned by a single call to
 *         apr_pollset_poll().
 */
APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset,
                                             apr_uint32_t size,
                                             apr_pool_t *p,
                                             apr_uint32_t flags);

/**
 * Set up a pollset object
 * @param pollset  The pointer in which to return the newly created object 
 * @param size The maximum number of descriptors that this pollset can hold
 * @param p The pool from which to allocate the pollset
 * @param flags Optional flags to modify the operation of the pollset.
 * @param method Poll method to use. See #apr_pollset_method_e.  If this
 *         method cannot be used, the default method will be used unless the
 *         APR_POLLSET_NODEFAULT flag has been specified.
 *
 * @remark If flags contains APR_POLLSET_THREADSAFE, then a pollset is
 *         created on which it is safe to make concurrent calls to
 *         apr_pollset_add(), apr_pollset_remove() and apr_pollset_poll()
 *         from separate threads.  This feature is only supported on some
 *         platforms; the apr_pollset_create_ex() call will fail with
 *         APR_ENOTIMPL on platforms where it is not supported.
 * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollset is
 *         created with additional internal pipe object used for the
 *         apr_pollset_wakeup() call. The actual size of pollset is
 *         in that case size + 1. This feature is only supported on some
 *         platforms; the apr_pollset_create_ex() call will fail with
 *         APR_ENOTIMPL on platforms where it is not supported.
 * @remark If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t
 *         structures passed to apr_pollset_add() are not copied and
 *         must have a lifetime at least as long as the pollset.
 * @remark Some poll methods (including APR_POLLSET_KQUEUE,
 *         APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a
 *         fixed limit on the size of the pollset. For these methods,
 *         the size parameter controls the maximum number of
 *         descriptors that will be returned by a single call to
 *         apr_pollset_poll().
 */
APR_DECLARE(apr_status_t) apr_pollset_create_ex(apr_pollset_t **pollset,
                                                apr_uint32_t size,
                                                apr_pool_t *p,
                                                apr_uint32_t flags,
                                                apr_pollset_method_e method);

/**
 * Destroy a pollset object
 * @param pollset The pollset to destroy
 */
APR_DECLARE(apr_status_t) apr_pollset_destroy(apr_pollset_t *pollset);

/**
 * Add a socket or file descriptor to a pollset
 * @param pollset The pollset to which to add the descriptor
 * @param descriptor The descriptor to add
 * @remark If you set client_data in the descriptor, that value
 *         will be returned in the client_data field whenever this
 *         descriptor is signalled in apr_pollset_poll().
 * @remark If the pollset has been created with APR_POLLSET_THREADSAFE
 *         and thread T1 is blocked in a call to apr_pollset_poll() for
 *         this same pollset that is being modified via apr_pollset_add()
 *         in thread T2, the currently executing apr_pollset_poll() call in
 *         T1 will either: (1) automatically include the newly added descriptor
 *         in the set of descriptors it is watching or (2) return immediately
 *         with APR_EINTR.  Option (1) is recommended, but option (2) is
 *         allowed for implementations where option (1) is impossible
 *         or impractical.
 * @remark If the pollset has been created with APR_POLLSET_NOCOPY, the 
 *         apr_pollfd_t structure referenced by descriptor will not be copied
 *         and must have a lifetime at least as long as the pollset.
 * @remark Do not add the same socket or file descriptor to the same pollset
 *         multiple times, even if the requested events differ for the 
 *         different calls to apr_pollset_add().  If the events of interest
 *         for a descriptor change, you must first remove the descriptor 
 *         from the pollset with apr_pollset_remove(), then add it again 
 *         specifying all requested events.
 */
APR_DECLARE(apr_status_t) apr_pollset_add(apr_pollset_t *pollset,
                                          const apr_pollfd_t *descriptor);

/**
 * Remove a descriptor from a pollset
 * @param pollset The pollset from which to remove the descriptor
 * @param descriptor The descriptor to remove
 * @remark If the descriptor is not found, APR_NOTFOUND is returned.
 * @remark If the pollset has been created with APR_POLLSET_THREADSAFE
 *         and thread T1 is blocked in a call to apr_pollset_poll() for
 *         this same pollset that is being modified via apr_pollset_remove()
 *         in thread T2, the currently executing apr_pollset_poll() call in
 *         T1 will either: (1) automatically exclude the newly added descriptor
 *         in the set of descriptors it is watching or (2) return immediately
 *         with APR_EINTR.  Option (1) is recommended, but option (2) is
 *         allowed for implementations where option (1) is impossible
 *         or impractical.
 * @remark apr_pollset_remove() cannot be used to remove a subset of requested
 *         events for a descriptor.  The reqevents field in the apr_pollfd_t
 *         parameter must contain the same value when removing as when adding.
 */
APR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset,
                                             const apr_pollfd_t *descriptor);

/**
 * Block for activity on the descriptor(s) in a pollset
 * @param pollset The pollset to use
 * @param timeout The amount of time in microseconds to wait.  This is a
 *                maximum, not a minimum.  If a descriptor is signalled, the
 *                function will return before this time.  If timeout is
 *                negative, the function will block until a descriptor is
 *                signalled or until apr_pollset_wakeup() has been called.
 * @param num Number of signalled descriptors (output parameter)
 * @param descriptors Array of signalled descriptors (output parameter)
 * @remark APR_EINTR will be returned if the pollset has been created with
 *         APR_POLLSET_WAKEABLE, apr_pollset_wakeup() has been called while
 *         waiting for activity, and there were no signalled descriptors at the
 *         time of the wakeup call.
 * @remark Multiple signalled conditions for the same descriptor may be reported
 *         in one or more returned apr_pollfd_t structures, depending on the
 *         implementation.
 */
APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset,
                                           apr_interval_time_t timeout,
                                           apr_int32_t *num,
                                           const apr_pollfd_t **descriptors);

/**
 * Interrupt the blocked apr_pollset_poll() call.
 * @param pollset The pollset to use
 * @remark If the pollset was not created with APR_POLLSET_WAKEABLE the
 *         return value is APR_EINIT.
 */
APR_DECLARE(apr_status_t) apr_pollset_wakeup(apr_pollset_t *pollset);

/**
 * Poll the descriptors in the poll structure
 * @param aprset The poll structure we will be using. 
 * @param numsock The number of descriptors we are polling
 * @param nsds The number of descriptors signalled (output parameter)
 * @param timeout The amount of time in microseconds to wait.  This is a
 *                maximum, not a minimum.  If a descriptor is signalled, the
 *                function will return before this time.  If timeout is
 *                negative, the function will block until a descriptor is
 *                signalled or until apr_pollset_wakeup() has been called.
 * @remark The number of descriptors signalled is returned in the third argument. 
 *         This is a blocking call, and it will not return until either a 
 *         descriptor has been signalled or the timeout has expired. 
 * @remark The rtnevents field in the apr_pollfd_t array will only be filled-
 *         in if the return value is APR_SUCCESS.
 */
APR_DECLARE(apr_status_t) apr_poll(apr_pollfd_t *aprset, apr_int32_t numsock,
                                   apr_int32_t *nsds, 
                                   apr_interval_time_t timeout);

/**
 * Return a printable representation of the pollset method.
 * @param pollset The pollset to use
 */
APR_DECLARE(const char *) apr_pollset_method_name(apr_pollset_t *pollset);

/**
 * Return a printable representation of the default pollset method
 * (APR_POLLSET_DEFAULT).
 */
APR_DECLARE(const char *) apr_poll_method_defname(void);

/** Opaque structure used for pollcb API */
typedef struct apr_pollcb_t apr_pollcb_t;

/**
 * Set up a pollcb object
 * @param pollcb  The pointer in which to return the newly created object 
 * @param size The maximum number of descriptors that a single _poll can return.
 * @param p The pool from which to allocate the pollcb
 * @param flags Optional flags to modify the operation of the pollcb.
 *
 * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollcb is
 *         created with an additional internal pipe object used for the
 *         apr_pollcb_wakeup() call. The actual size of pollcb is
 *         in that case @a size + 1.
 * @remark Pollcb is only supported on some platforms; the apr_pollcb_create()
 *         call will fail with APR_ENOTIMPL on platforms where it is not supported.
 */
APR_DECLARE(apr_status_t) apr_pollcb_create(apr_pollcb_t **pollcb,
                                            apr_uint32_t size,
                                            apr_pool_t *p,
                                            apr_uint32_t flags);

/**
 * Set up a pollcb object
 * @param pollcb  The pointer in which to return the newly created object 
 * @param size The maximum number of descriptors that a single _poll can return.
 * @param p The pool from which to allocate the pollcb
 * @param flags Optional flags to modify the operation of the pollcb.
 * @param method Poll method to use. See #apr_pollset_method_e.  If this
 *         method cannot be used, the default method will be used unless the
 *         APR_POLLSET_NODEFAULT flag has been specified.
 *
 * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollcb is
 *         created with an additional internal pipe object used for the
 *         apr_pollcb_wakeup() call. The actual size of pollcb is
 *         in that case @a size + 1.
 * @remark Pollcb is only supported on some platforms; the apr_pollcb_create_ex()
 *         call will fail with APR_ENOTIMPL on platforms where it is not supported.
 */
APR_DECLARE(apr_status_t) apr_pollcb_create_ex(apr_pollcb_t **pollcb,
                                               apr_uint32_t size,
                                               apr_pool_t *p,
                                               apr_uint32_t flags,
                                               apr_pollset_method_e method);

/**
 * Add a socket or file descriptor to a pollcb
 * @param pollcb The pollcb to which to add the descriptor
 * @param descriptor The descriptor to add
 * @remark If you set client_data in the descriptor, that value will be
 *         returned in the client_data field whenever this descriptor is
 *         signalled in apr_pollcb_poll().
 * @remark Unlike the apr_pollset API, the descriptor is not copied, and users 
 *         must retain the memory used by descriptor, as the same pointer will
 *         be returned to them from apr_pollcb_poll.
 * @remark Do not add the same socket or file descriptor to the same pollcb
 *         multiple times, even if the requested events differ for the 
 *         different calls to apr_pollcb_add().  If the events of interest
 *         for a descriptor change, you must first remove the descriptor 
 *         from the pollcb with apr_pollcb_remove(), then add it again 
 *         specifying all requested events.
 */
APR_DECLARE(apr_status_t) apr_pollcb_add(apr_pollcb_t *pollcb,
                                         apr_pollfd_t *descriptor);
/**
 * Remove a descriptor from a pollcb
 * @param pollcb The pollcb from which to remove the descriptor
 * @param descriptor The descriptor to remove
 * @remark If the descriptor is not found, APR_NOTFOUND is returned.
 * @remark apr_pollcb_remove() cannot be used to remove a subset of requested
 *         events for a descriptor.  The reqevents field in the apr_pollfd_t
 *         parameter must contain the same value when removing as when adding.
 */
APR_DECLARE(apr_status_t) apr_pollcb_remove(apr_pollcb_t *pollcb,
                                            apr_pollfd_t *descriptor);

/**
 * Function prototype for pollcb handlers 
 * @param baton Opaque baton passed into apr_pollcb_poll()
 * @param descriptor Contains the notification for an active descriptor. 
 *                   The @a rtnevents member describes which events were triggered
 *                   for this descriptor.
 * @remark If the pollcb handler does not return APR_SUCCESS, the apr_pollcb_poll()
 *         call returns with the handler's return value.
 */
typedef apr_status_t (*apr_pollcb_cb_t)(void *baton, apr_pollfd_t *descriptor);

/**
 * Block for activity on the descriptor(s) in a pollcb
 * @param pollcb The pollcb to use
 * @param timeout The amount of time in microseconds to wait.  This is a
 *                maximum, not a minimum.  If a descriptor is signalled, the
 *                function will return before this time.  If timeout is
 *                negative, the function will block until a descriptor is
 *                signalled or until apr_pollcb_wakeup() has been called.
 * @param func Callback function to call for each active descriptor.
 * @param baton Opaque baton passed to the callback function.
 * @remark Multiple signalled conditions for the same descriptor may be reported
 *         in one or more calls to the callback function, depending on the
 *         implementation.
 * @remark APR_EINTR will be returned if the pollset has been created with
 *         APR_POLLSET_WAKEABLE and apr_pollcb_wakeup() has been called while
 *         waiting for activity.
 */
APR_DECLARE(apr_status_t) apr_pollcb_poll(apr_pollcb_t *pollcb,
                                          apr_interval_time_t timeout,
                                          apr_pollcb_cb_t func,
                                          void *baton);

/**
 * Interrupt the blocked apr_pollcb_poll() call.
 * @param pollcb The pollcb to use
 * @remark If the pollcb was not created with APR_POLLSET_WAKEABLE the
 *         return value is APR_EINIT.
 */
APR_DECLARE(apr_status_t) apr_pollcb_wakeup(apr_pollcb_t *pollcb);

/**
 * Return a printable representation of the pollcb method.
 * @param pollcb The pollcb to use
 */
APR_DECLARE(const char *) apr_pollcb_method_name(apr_pollcb_t *pollcb);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_POLL_H */

include/apr-1/apr_mmap.h000064400000012015150336140420011051 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_MMAP_H
#define APR_MMAP_H

/**
 * @file apr_mmap.h
 * @brief APR MMAP routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_ring.h"
#include "apr_file_io.h"        /* for apr_file_t */

#ifdef BEOS
#include <kernel/OS.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_mmap MMAP (Memory Map) Routines
 * @ingroup APR 
 * @{
 */

/** MMap opened for reading */
#define APR_MMAP_READ    1
/** MMap opened for writing */
#define APR_MMAP_WRITE   2

/** @see apr_mmap_t */
typedef struct apr_mmap_t            apr_mmap_t;

/**
 * @remark
 * As far as I can tell the only really sane way to store an MMAP is as a
 * void * and a length.  BeOS requires this area_id, but that's just a little
 * something extra.  I am exposing this type, because it doesn't make much
 * sense to keep it private, and opening it up makes some stuff easier in
 * Apache.
 */
/** The MMAP structure */
struct apr_mmap_t {
    /** The pool the mmap structure was allocated out of. */
    apr_pool_t *cntxt;
#ifdef BEOS
    /** An area ID.  Only valid on BeOS */
    area_id area;
#endif
#ifdef WIN32
    /** The handle of the file mapping */
    HANDLE mhandle;
    /** The start of the real memory page area (mapped view) */
    void *mv;
    /** The physical start, size and offset */
    apr_off_t  pstart;
    apr_size_t psize;
    apr_off_t  poffset;
#endif
    /** The start of the memory mapped area */
    void *mm;
    /** The amount of data in the mmap */
    apr_size_t size;
    /** ring of apr_mmap_t's that reference the same
     * mmap'ed region; acts in place of a reference count */
    APR_RING_ENTRY(apr_mmap_t) link;
};

#if APR_HAS_MMAP || defined(DOXYGEN)

/** @def APR_MMAP_THRESHOLD 
 * Files have to be at least this big before they're mmap()d.  This is to deal
 * with systems where the expense of doing an mmap() and an munmap() outweighs
 * the benefit for small files.  It shouldn't be set lower than 1.
 */
#ifdef MMAP_THRESHOLD
#  define APR_MMAP_THRESHOLD              MMAP_THRESHOLD
#else
#  ifdef SUNOS4
#    define APR_MMAP_THRESHOLD            (8*1024)
#  else
#    define APR_MMAP_THRESHOLD            1
#  endif /* SUNOS4 */
#endif /* MMAP_THRESHOLD */

/** @def APR_MMAP_LIMIT
 * Maximum size of MMap region
 */
#ifdef MMAP_LIMIT
#  define APR_MMAP_LIMIT                  MMAP_LIMIT
#else
#  define APR_MMAP_LIMIT                  (4*1024*1024)
#endif /* MMAP_LIMIT */

/** Can this file be MMaped */
#define APR_MMAP_CANDIDATE(filelength) \
    ((filelength >= APR_MMAP_THRESHOLD) && (filelength < APR_MMAP_LIMIT))

/*   Function definitions */

/** 
 * Create a new mmap'ed file out of an existing APR file.
 * @param newmmap The newly created mmap'ed file.
 * @param file The file to turn into an mmap.
 * @param offset The offset into the file to start the data pointer at.
 * @param size The size of the file
 * @param flag bit-wise or of:
 * <PRE>
 *          APR_MMAP_READ       MMap opened for reading
 *          APR_MMAP_WRITE      MMap opened for writing
 * </PRE>
 * @param cntxt The pool to use when creating the mmap.
 */
APR_DECLARE(apr_status_t) apr_mmap_create(apr_mmap_t **newmmap, 
                                          apr_file_t *file, apr_off_t offset,
                                          apr_size_t size, apr_int32_t flag,
                                          apr_pool_t *cntxt);

/**
 * Duplicate the specified MMAP.
 * @param new_mmap The structure to duplicate into. 
 * @param old_mmap The mmap to duplicate.
 * @param p The pool to use for new_mmap.
 */         
APR_DECLARE(apr_status_t) apr_mmap_dup(apr_mmap_t **new_mmap,
                                       apr_mmap_t *old_mmap,
                                       apr_pool_t *p);

/**
 * Remove a mmap'ed.
 * @param mm The mmap'ed file.
 */
APR_DECLARE(apr_status_t) apr_mmap_delete(apr_mmap_t *mm);

/** 
 * Move the pointer into the mmap'ed file to the specified offset.
 * @param addr The pointer to the offset specified.
 * @param mm The mmap'ed file.
 * @param offset The offset to move to.
 */
APR_DECLARE(apr_status_t) apr_mmap_offset(void **addr, apr_mmap_t *mm, 
                                          apr_off_t offset);

#endif /* APR_HAS_MMAP */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_MMAP_H */
include/apr-1/apr_buckets.h000064400000176225150336140420011575 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file apr_buckets.h
 * @brief APR-UTIL Buckets/Bucket Brigades
 */

#ifndef APR_BUCKETS_H
#define APR_BUCKETS_H

#if defined(APR_BUCKET_DEBUG) && !defined(APR_RING_DEBUG)
#define APR_RING_DEBUG
#endif

#include "apu.h"
#include "apr_network_io.h"
#include "apr_file_io.h"
#include "apr_general.h"
#include "apr_mmap.h"
#include "apr_errno.h"
#include "apr_ring.h"
#include "apr.h"
#if APR_HAVE_SYS_UIO_H
#include <sys/uio.h>	/* for struct iovec */
#endif
#if APR_HAVE_STDARG_H
#include <stdarg.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup APR_Util_Bucket_Brigades Bucket Brigades
 * @ingroup APR_Util
 * @{ 
 */

/** default bucket buffer size - 8KB minus room for memory allocator headers */
#define APR_BUCKET_BUFF_SIZE 8000

/** Determines how a bucket or brigade should be read */
typedef enum {
    APR_BLOCK_READ,   /**< block until data becomes available */
    APR_NONBLOCK_READ /**< return immediately if no data is available */
} apr_read_type_e;

/**
 * The one-sentence buzzword-laden overview: Bucket brigades represent
 * a complex data stream that can be passed through a layered IO
 * system without unnecessary copying. A longer overview follows...
 *
 * A bucket brigade is a doubly linked list (ring) of buckets, so we
 * aren't limited to inserting at the front and removing at the end.
 * Buckets are only passed around as members of a brigade, although
 * singleton buckets can occur for short periods of time.
 *
 * Buckets are data stores of various types. They can refer to data in
 * memory, or part of a file or mmap area, or the output of a process,
 * etc. Buckets also have some type-dependent accessor functions:
 * read, split, copy, setaside, and destroy.
 *
 * read returns the address and size of the data in the bucket. If the
 * data isn't in memory then it is read in and the bucket changes type
 * so that it can refer to the new location of the data. If all the
 * data doesn't fit in the bucket then a new bucket is inserted into
 * the brigade to hold the rest of it.
 *
 * split divides the data in a bucket into two regions. After a split
 * the original bucket refers to the first part of the data and a new
 * bucket inserted into the brigade after the original bucket refers
 * to the second part of the data. Reference counts are maintained as
 * necessary.
 *
 * setaside ensures that the data in the bucket has a long enough
 * lifetime. Sometimes it is convenient to create a bucket referring
 * to data on the stack in the expectation that it will be consumed
 * (output to the network) before the stack is unwound. If that
 * expectation turns out not to be valid, the setaside function is
 * called to move the data somewhere safer.
 *
 * copy makes a duplicate of the bucket structure as long as it's
 * possible to have multiple references to a single copy of the
 * data itself.  Not all bucket types can be copied.
 *
 * destroy maintains the reference counts on the resources used by a
 * bucket and frees them if necessary.
 *
 * Note: all of the above functions have wrapper macros (apr_bucket_read(),
 * apr_bucket_destroy(), etc), and those macros should be used rather
 * than using the function pointers directly.
 *
 * To write a bucket brigade, they are first made into an iovec, so that we
 * don't write too little data at one time.  Currently we ignore compacting the
 * buckets into as few buckets as possible, but if we really want good
 * performance, then we need to compact the buckets before we convert to an
 * iovec, or possibly while we are converting to an iovec.
 */

/*
 * Forward declaration of the main types.
 */

/** @see apr_bucket_brigade */
typedef struct apr_bucket_brigade apr_bucket_brigade;
/** @see apr_bucket */
typedef struct apr_bucket apr_bucket;
/** @see apr_bucket_alloc_t */
typedef struct apr_bucket_alloc_t apr_bucket_alloc_t;

/** @see apr_bucket_type_t */
typedef struct apr_bucket_type_t apr_bucket_type_t;

/**
 * Basic bucket type
 */
struct apr_bucket_type_t {
    /**
     * The name of the bucket type
     */
    const char *name;
    /** 
     * The number of functions this bucket understands.  Can not be less than
     * five.
     */
    int num_func;
    /**
     * Whether the bucket contains metadata (ie, information that
     * describes the regular contents of the brigade).  The metadata
     * is not returned by apr_bucket_read() and is not indicated by
     * the ->length of the apr_bucket itself.  In other words, an
     * empty bucket is safe to arbitrarily remove if and only if it
     * contains no metadata.  In this sense, "data" is just raw bytes
     * that are the "content" of the brigade and "metadata" describes
     * that data but is not a proper part of it.
     */
    enum {
        /** This bucket type represents actual data to send to the client. */
        APR_BUCKET_DATA = 0,
        /** This bucket type represents metadata. */
        APR_BUCKET_METADATA = 1
    } is_metadata;
    /**
     * Free the private data and any resources used by the bucket (if they
     *  aren't shared with another bucket).  This function is required to be
     *  implemented for all bucket types, though it might be a no-op on some
     *  of them (namely ones that never allocate any private data structures).
     * @param data The private data pointer from the bucket to be destroyed
     */
    void (*destroy)(void *data);

    /**
     * Read the data from the bucket. This is required to be implemented
     *  for all bucket types.
     * @param b The bucket to read from
     * @param str A place to store the data read.  Allocation should only be
     *            done if absolutely necessary. 
     * @param len The amount of data read.
     * @param block Should this read function block if there is more data that
     *              cannot be read immediately.
     */
    apr_status_t (*read)(apr_bucket *b, const char **str, apr_size_t *len, 
                         apr_read_type_e block);
    
    /**
     * Make it possible to set aside the data for at least as long as the
     *  given pool. Buckets containing data that could potentially die before
     *  this pool (e.g. the data resides on the stack, in a child pool of
     *  the given pool, or in a disjoint pool) must somehow copy, shift, or
     *  transform the data to have the proper lifetime.
     * @param e The bucket to convert
     * @remark Some bucket types contain data that will always outlive the
     *         bucket itself. For example no data (EOS and FLUSH), or the data
     *         resides in global, constant memory (IMMORTAL), or the data is on
     *      the heap (HEAP). For these buckets, apr_bucket_setaside_noop can
     *      be used.
     */
    apr_status_t (*setaside)(apr_bucket *e, apr_pool_t *pool);

    /**
     * Split one bucket in two at the specified position by duplicating
     *  the bucket structure (not the data) and modifying any necessary
     *  start/end/offset information.  If it's not possible to do this
     *  for the bucket type (perhaps the length of the data is indeterminate,
     *  as with pipe and socket buckets), then APR_ENOTIMPL is returned.
     * @param e The bucket to split
     * @param point The offset of the first byte in the new bucket
     */
    apr_status_t (*split)(apr_bucket *e, apr_size_t point);

    /**
     * Copy the bucket structure (not the data), assuming that this is
     *  possible for the bucket type. If it's not, APR_ENOTIMPL is returned.
     * @param e The bucket to copy
     * @param c Returns a pointer to the new bucket
     */
    apr_status_t (*copy)(apr_bucket *e, apr_bucket **c);

};

/**
 * apr_bucket structures are allocated on the malloc() heap and
 * their lifetime is controlled by the parent apr_bucket_brigade
 * structure. Buckets can move from one brigade to another e.g. by
 * calling APR_BRIGADE_CONCAT(). In general the data in a bucket has
 * the same lifetime as the bucket and is freed when the bucket is
 * destroyed; if the data is shared by more than one bucket (e.g.
 * after a split) the data is freed when the last bucket goes away.
 */
struct apr_bucket {
    /** Links to the rest of the brigade */
    APR_RING_ENTRY(apr_bucket) link;
    /** The type of bucket.  */
    const apr_bucket_type_t *type;
    /** The length of the data in the bucket.  This could have been implemented
     *  with a function, but this is an optimization, because the most
     *  common thing to do will be to get the length.  If the length is unknown,
     *  the value of this field will be (apr_size_t)(-1).
     */
    apr_size_t length;
    /** The start of the data in the bucket relative to the private base
     *  pointer.  The vast majority of bucket types allow a fixed block of
     *  data to be referenced by multiple buckets, each bucket pointing to
     *  a different segment of the data.  That segment starts at base+start
     *  and ends at base+start+length.  
     *  If the length == (apr_size_t)(-1), then start == -1.
     */
    apr_off_t start;
    /** type-dependent data hangs off this pointer */
    void *data;	
    /**
     * Pointer to function used to free the bucket. This function should
     * always be defined and it should be consistent with the memory
     * function used to allocate the bucket. For example, if malloc() is 
     * used to allocate the bucket, this pointer should point to free().
     * @param e Pointer to the bucket being freed
     */
    void (*free)(void *e);
    /** The freelist from which this bucket was allocated */
    apr_bucket_alloc_t *list;
};

/** A list of buckets */
struct apr_bucket_brigade {
    /** The pool to associate the brigade with.  The data is not allocated out
     *  of the pool, but a cleanup is registered with this pool.  If the 
     *  brigade is destroyed by some mechanism other than pool destruction,
     *  the destroying function is responsible for killing the cleanup.
     */
    apr_pool_t *p;
    /** The buckets in the brigade are on this list. */
    /*
     * The apr_bucket_list structure doesn't actually need a name tag
     * because it has no existence independent of struct apr_bucket_brigade;
     * the ring macros are designed so that you can leave the name tag
     * argument empty in this situation but apparently the Windows compiler
     * doesn't like that.
     */
    APR_RING_HEAD(apr_bucket_list, apr_bucket) list;
    /** The freelist from which this bucket was allocated */
    apr_bucket_alloc_t *bucket_alloc;
};


/**
 * Function called when a brigade should be flushed
 */
typedef apr_status_t (*apr_brigade_flush)(apr_bucket_brigade *bb, void *ctx);

/*
 * define APR_BUCKET_DEBUG if you want your brigades to be checked for
 * validity at every possible instant.  this will slow your code down
 * substantially but is a very useful debugging tool.
 */
#ifdef APR_BUCKET_DEBUG

#define APR_BRIGADE_CHECK_CONSISTENCY(b)				\
        APR_RING_CHECK_CONSISTENCY(&(b)->list, apr_bucket, link)

#define APR_BUCKET_CHECK_CONSISTENCY(e)					\
        APR_RING_CHECK_ELEM_CONSISTENCY((e), apr_bucket, link)

#else
/**
 * checks the ring pointers in a bucket brigade for consistency.  an
 * abort() will be triggered if any inconsistencies are found.
 *   note: this is a no-op unless APR_BUCKET_DEBUG is defined.
 * @param b The brigade
 */
#define APR_BRIGADE_CHECK_CONSISTENCY(b)
/**
 * checks the brigade a bucket is in for ring consistency.  an
 * abort() will be triggered if any inconsistencies are found.
 *   note: this is a no-op unless APR_BUCKET_DEBUG is defined.
 * @param e The bucket
 */
#define APR_BUCKET_CHECK_CONSISTENCY(e)
#endif


/**
 * Wrappers around the RING macros to reduce the verbosity of the code
 * that handles bucket brigades.
 */
/**
 * The magic pointer value that indicates the head of the brigade
 * @remark This is used to find the beginning and end of the brigade, eg:
 * <pre>
 *      while (e != APR_BRIGADE_SENTINEL(b)) {
 *          ...
 *          e = APR_BUCKET_NEXT(e);
 *      }
 * </pre>
 * @param  b The brigade
 * @return The magic pointer value
 */
#define APR_BRIGADE_SENTINEL(b)	APR_RING_SENTINEL(&(b)->list, apr_bucket, link)

/**
 * Determine if the bucket brigade is empty
 * @param b The brigade to check
 * @return true or false
 */
#define APR_BRIGADE_EMPTY(b)	APR_RING_EMPTY(&(b)->list, apr_bucket, link)

/**
 * Return the first bucket in a brigade
 * @param b The brigade to query
 * @return The first bucket in the brigade
 */
#define APR_BRIGADE_FIRST(b)	APR_RING_FIRST(&(b)->list)
/**
 * Return the last bucket in a brigade
 * @param b The brigade to query
 * @return The last bucket in the brigade
 */
#define APR_BRIGADE_LAST(b)	APR_RING_LAST(&(b)->list)

/**
 * Insert a single bucket at the front of a brigade
 * @param b The brigade to add to
 * @param e The bucket to insert
 */
#define APR_BRIGADE_INSERT_HEAD(b, e) do {				\
	apr_bucket *ap__b = (e);                                        \
	APR_RING_INSERT_HEAD(&(b)->list, ap__b, apr_bucket, link);	\
        APR_BRIGADE_CHECK_CONSISTENCY((b));				\
    } while (0)

/**
 * Insert a single bucket at the end of a brigade
 * @param b The brigade to add to
 * @param e The bucket to insert
 */
#define APR_BRIGADE_INSERT_TAIL(b, e) do {				\
	apr_bucket *ap__b = (e);					\
	APR_RING_INSERT_TAIL(&(b)->list, ap__b, apr_bucket, link);	\
        APR_BRIGADE_CHECK_CONSISTENCY((b));				\
    } while (0)

/**
 * Concatenate brigade b onto the end of brigade a, leaving brigade b empty
 * @param a The first brigade
 * @param b The second brigade
 */
#define APR_BRIGADE_CONCAT(a, b) do {					\
        APR_RING_CONCAT(&(a)->list, &(b)->list, apr_bucket, link);	\
        APR_BRIGADE_CHECK_CONSISTENCY((a));				\
    } while (0)

/**
 * Prepend brigade b onto the beginning of brigade a, leaving brigade b empty
 * @param a The first brigade
 * @param b The second brigade
 */
#define APR_BRIGADE_PREPEND(a, b) do {					\
        APR_RING_PREPEND(&(a)->list, &(b)->list, apr_bucket, link);	\
        APR_BRIGADE_CHECK_CONSISTENCY((a));				\
    } while (0)

/**
 * Insert a single bucket before a specified bucket
 * @param a The bucket to insert before
 * @param b The bucket to insert
 */
#define APR_BUCKET_INSERT_BEFORE(a, b) do {				\
	apr_bucket *ap__a = (a), *ap__b = (b);				\
	APR_RING_INSERT_BEFORE(ap__a, ap__b, link);			\
        APR_BUCKET_CHECK_CONSISTENCY(ap__a);				\
    } while (0)

/**
 * Insert a single bucket after a specified bucket
 * @param a The bucket to insert after
 * @param b The bucket to insert
 */
#define APR_BUCKET_INSERT_AFTER(a, b) do {				\
	apr_bucket *ap__a = (a), *ap__b = (b);				\
	APR_RING_INSERT_AFTER(ap__a, ap__b, link);			\
        APR_BUCKET_CHECK_CONSISTENCY(ap__a);				\
    } while (0)

/**
 * Get the next bucket in the list
 * @param e The current bucket
 * @return The next bucket
 */
#define APR_BUCKET_NEXT(e)	APR_RING_NEXT((e), link)
/**
 * Get the previous bucket in the list
 * @param e The current bucket
 * @return The previous bucket
 */
#define APR_BUCKET_PREV(e)	APR_RING_PREV((e), link)

/**
 * Remove a bucket from its bucket brigade
 * @param e The bucket to remove
 */
#define APR_BUCKET_REMOVE(e)	APR_RING_REMOVE((e), link)

/**
 * Initialize a new bucket's prev/next pointers
 * @param e The bucket to initialize
 */
#define APR_BUCKET_INIT(e)	APR_RING_ELEM_INIT((e), link)

/**
 * Determine if a bucket contains metadata.  An empty bucket is
 * safe to arbitrarily remove if and only if this is false.
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_METADATA(e)    ((e)->type->is_metadata)

/**
 * Determine if a bucket is a FLUSH bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_FLUSH(e)       ((e)->type == &apr_bucket_type_flush)
/**
 * Determine if a bucket is an EOS bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_EOS(e)         ((e)->type == &apr_bucket_type_eos)
/**
 * Determine if a bucket is a FILE bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_FILE(e)        ((e)->type == &apr_bucket_type_file)
/**
 * Determine if a bucket is a PIPE bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_PIPE(e)        ((e)->type == &apr_bucket_type_pipe)
/**
 * Determine if a bucket is a SOCKET bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_SOCKET(e)      ((e)->type == &apr_bucket_type_socket)
/**
 * Determine if a bucket is a HEAP bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_HEAP(e)        ((e)->type == &apr_bucket_type_heap)
/**
 * Determine if a bucket is a TRANSIENT bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_TRANSIENT(e)   ((e)->type == &apr_bucket_type_transient)
/**
 * Determine if a bucket is a IMMORTAL bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_IMMORTAL(e)    ((e)->type == &apr_bucket_type_immortal)
#if APR_HAS_MMAP
/**
 * Determine if a bucket is a MMAP bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_MMAP(e)        ((e)->type == &apr_bucket_type_mmap)
#endif
/**
 * Determine if a bucket is a POOL bucket
 * @param e The bucket to inspect
 * @return true or false
 */
#define APR_BUCKET_IS_POOL(e)        ((e)->type == &apr_bucket_type_pool)

/*
 * General-purpose reference counting for the various bucket types.
 *
 * Any bucket type that keeps track of the resources it uses (i.e.
 * most of them except for IMMORTAL, TRANSIENT, and EOS) needs to
 * attach a reference count to the resource so that it can be freed
 * when the last bucket that uses it goes away. Resource-sharing may
 * occur because of bucket splits or buckets that refer to globally
 * cached data. */

/** @see apr_bucket_refcount */
typedef struct apr_bucket_refcount apr_bucket_refcount;
/**
 * The structure used to manage the shared resource must start with an
 * apr_bucket_refcount which is updated by the general-purpose refcount
 * code. A pointer to the bucket-type-dependent private data structure
 * can be cast to a pointer to an apr_bucket_refcount and vice versa.
 */
struct apr_bucket_refcount {
    /** The number of references to this bucket */
    int          refcount;
};

/*  *****  Reference-counted bucket types  *****  */

/** @see apr_bucket_heap */
typedef struct apr_bucket_heap apr_bucket_heap;
/**
 * A bucket referring to data allocated off the heap.
 */
struct apr_bucket_heap {
    /** Number of buckets using this memory */
    apr_bucket_refcount  refcount;
    /** The start of the data actually allocated.  This should never be
     * modified, it is only used to free the bucket.
     */
    char    *base;
    /** how much memory was allocated */
    apr_size_t  alloc_len;
    /** function to use to delete the data */
    void (*free_func)(void *data);
};

/** @see apr_bucket_pool */
typedef struct apr_bucket_pool apr_bucket_pool;
/**
 * A bucket referring to data allocated from a pool
 */
struct apr_bucket_pool {
    /** The pool bucket must be able to be easily morphed to a heap
     * bucket if the pool gets cleaned up before all references are
     * destroyed.  This apr_bucket_heap structure is populated automatically
     * when the pool gets cleaned up, and subsequent calls to pool_read()
     * will result in the apr_bucket in question being morphed into a
     * regular heap bucket.  (To avoid having to do many extra refcount
     * manipulations and b->data manipulations, the apr_bucket_pool
     * struct actually *contains* the apr_bucket_heap struct that it
     * will become as its first element; the two share their
     * apr_bucket_refcount members.)
     */
    apr_bucket_heap  heap;
    /** The block of data actually allocated from the pool.
     * Segments of this block are referenced by adjusting
     * the start and length of the apr_bucket accordingly.
     * This will be NULL after the pool gets cleaned up.
     */
    const char *base;
    /** The pool the data was allocated from.  When the pool
     * is cleaned up, this gets set to NULL as an indicator
     * to pool_read() that the data is now on the heap and
     * so it should morph the bucket into a regular heap
     * bucket before continuing.
     */
    apr_pool_t *pool;
    /** The freelist this structure was allocated from, which is
     * needed in the cleanup phase in order to allocate space on the heap
     */
    apr_bucket_alloc_t *list;
};

#if APR_HAS_MMAP
/** @see apr_bucket_mmap */
typedef struct apr_bucket_mmap apr_bucket_mmap;
/**
 * A bucket referring to an mmap()ed file
 */
struct apr_bucket_mmap {
    /** Number of buckets using this memory */
    apr_bucket_refcount  refcount;
    /** The mmap this sub_bucket refers to */
    apr_mmap_t *mmap;
};
#endif

/** @see apr_bucket_file */
typedef struct apr_bucket_file apr_bucket_file;
/**
 * A bucket referring to an file
 */
struct apr_bucket_file {
    /** Number of buckets using this memory */
    apr_bucket_refcount  refcount;
    /** The file this bucket refers to */
    apr_file_t *fd;
    /** The pool into which any needed structures should
     *  be created while reading from this file bucket */
    apr_pool_t *readpool;
#if APR_HAS_MMAP
    /** Whether this bucket should be memory-mapped if
     *  a caller tries to read from it */
    int can_mmap;
#endif /* APR_HAS_MMAP */
    /** File read block size */
    apr_size_t read_size;
};

/** @see apr_bucket_structs */
typedef union apr_bucket_structs apr_bucket_structs;
/**
 * A union of all bucket structures so we know what
 * the max size is.
 */
union apr_bucket_structs {
    apr_bucket      b;      /**< Bucket */
    apr_bucket_heap heap;   /**< Heap */
    apr_bucket_pool pool;   /**< Pool */
#if APR_HAS_MMAP
    apr_bucket_mmap mmap;   /**< MMap */
#endif
    apr_bucket_file file;   /**< File */
};

/**
 * The amount that apr_bucket_alloc() should allocate in the common case.
 * Note: this is twice as big as apr_bucket_structs to allow breathing
 * room for third-party bucket types.
 */
#define APR_BUCKET_ALLOC_SIZE  APR_ALIGN_DEFAULT(2*sizeof(apr_bucket_structs))

/*  *****  Bucket Brigade Functions  *****  */
/**
 * Create a new bucket brigade.  The bucket brigade is originally empty.
 * @param p The pool to associate with the brigade.  Data is not allocated out
 *          of the pool, but a cleanup is registered.
 * @param list The bucket allocator to use
 * @return The empty bucket brigade
 */
APU_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p,
                                                     apr_bucket_alloc_t *list);

/**
 * destroy an entire bucket brigade.  This includes destroying all of the
 * buckets within the bucket brigade's bucket list. 
 * @param b The bucket brigade to destroy
 */
APU_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b);

/**
 * empty out an entire bucket brigade.  This includes destroying all of the
 * buckets within the bucket brigade's bucket list.  This is similar to
 * apr_brigade_destroy(), except that it does not deregister the brigade's
 * pool cleanup function.
 * @param data The bucket brigade to clean up
 * @remark Generally, you should use apr_brigade_destroy().  This function
 *         can be useful in situations where you have a single brigade that
 *         you wish to reuse many times by destroying all of the buckets in
 *         the brigade and putting new buckets into it later.
 */
APU_DECLARE(apr_status_t) apr_brigade_cleanup(void *data);

/**
 * Move the buckets from the tail end of the existing brigade @a b into
 * the brigade @a a. If @a a is NULL a new brigade is created. Buckets
 * from @a e to the last bucket (inclusively) of brigade @a b are moved
 * from @a b to the returned brigade @a a.
 *
 * @param b The brigade to split
 * @param e The first bucket to move
 * @param a The brigade which should be used for the result or NULL if
 *          a new brigade should be created. The brigade @a a will be
 *          cleared if it is not empty.
 * @return The brigade supplied in @a a or a new one if @a a was NULL.
 * @warning Note that this function allocates a new brigade if @a a is
 * NULL so memory consumption should be carefully considered.
 */
APU_DECLARE(apr_bucket_brigade *) apr_brigade_split_ex(apr_bucket_brigade *b,
                                                       apr_bucket *e,
                                                       apr_bucket_brigade *a);

/**
 * Create a new bucket brigade and move the buckets from the tail end
 * of an existing brigade into the new brigade.  Buckets from 
 * @a e to the last bucket (inclusively) of brigade @a b
 * are moved from @a b to the returned brigade.
 * @param b The brigade to split 
 * @param e The first bucket to move
 * @return The new brigade
 * @warning Note that this function always allocates a new brigade
 * so memory consumption should be carefully considered.
 */
APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b,
                                                    apr_bucket *e);

/**
 * Partition a bucket brigade at a given offset (in bytes from the start of
 * the brigade).  This is useful whenever a filter wants to use known ranges
 * of bytes from the brigade; the ranges can even overlap.
 * @param b The brigade to partition
 * @param point The offset at which to partition the brigade
 * @param after_point Returns a pointer to the first bucket after the partition
 * @return APR_SUCCESS on success, APR_INCOMPLETE if the contents of the
 * brigade were shorter than @a point, or an error code.
 * @remark if APR_INCOMPLETE is returned, @a after_point will be set to
 * the brigade sentinel.
 */
APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
                                                apr_off_t point,
                                                apr_bucket **after_point);

/**
 * Return the total length of the brigade.
 * @param bb The brigade to compute the length of
 * @param read_all Read unknown-length buckets to force a size
 * @param length Returns the length of the brigade (up to the end, or up
 *               to a bucket read error), or -1 if the brigade has buckets
 *               of indeterminate length and read_all is 0.
 */
APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
                                             int read_all,
                                             apr_off_t *length);

/**
 * Take a bucket brigade and store the data in a flat char*
 * @param bb The bucket brigade to create the char* from
 * @param c The char* to write into
 * @param len The maximum length of the char array. On return, it is the
 *            actual length of the char array.
 */
APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
                                              char *c,
                                              apr_size_t *len);

/**
 * Creates a pool-allocated string representing a flat bucket brigade
 * @param bb The bucket brigade to create the char array from
 * @param c On return, the allocated char array
 * @param len On return, the length of the char array.
 * @param pool The pool to allocate the string from.
 */
APU_DECLARE(apr_status_t) apr_brigade_pflatten(apr_bucket_brigade *bb, 
                                               char **c,
                                               apr_size_t *len,
                                               apr_pool_t *pool);

/**
 * Split a brigade to represent one LF line.
 * @param bbOut The bucket brigade that will have the LF line appended to.
 * @param bbIn The input bucket brigade to search for a LF-line.
 * @param block The blocking mode to be used to split the line.
 * @param maxbytes The maximum bytes to read.  If this many bytes are seen
 *                 without a LF, the brigade will contain a partial line.
 */
APU_DECLARE(apr_status_t) apr_brigade_split_line(apr_bucket_brigade *bbOut,
                                                 apr_bucket_brigade *bbIn,
                                                 apr_read_type_e block,
                                                 apr_off_t maxbytes);

/**
 * Create an iovec of the elements in a bucket_brigade... return number 
 * of elements used.  This is useful for writing to a file or to the
 * network efficiently.
 * @param b The bucket brigade to create the iovec from
 * @param vec The iovec to create
 * @param nvec The number of elements in the iovec. On return, it is the
 *             number of iovec elements actually filled out.
 */
APU_DECLARE(apr_status_t) apr_brigade_to_iovec(apr_bucket_brigade *b, 
                                               struct iovec *vec, int *nvec);

/**
 * This function writes a list of strings into a bucket brigade. 
 * @param b The bucket brigade to add to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param va A list of strings to add
 * @return APR_SUCCESS or error code.
 */
APU_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b,
                                               apr_brigade_flush flush,
                                               void *ctx,
                                               va_list va);

/**
 * This function writes a string into a bucket brigade.
 *
 * The apr_brigade_write function attempts to be efficient with the
 * handling of heap buckets. Regardless of the amount of data stored
 * inside a heap bucket, heap buckets are a fixed size to promote their
 * reuse.
 *
 * If an attempt is made to write a string to a brigade that already 
 * ends with a heap bucket, this function will attempt to pack the
 * string into the remaining space in the previous heap bucket, before
 * allocating a new heap bucket.
 *
 * This function always returns APR_SUCCESS, unless a flush function is
 * passed, in which case the return value of the flush function will be
 * returned if used.
 * @param b The bucket brigade to add to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param str The string to add
 * @param nbyte The number of bytes to write
 * @return APR_SUCCESS or error code
 */
APU_DECLARE(apr_status_t) apr_brigade_write(apr_bucket_brigade *b,
                                            apr_brigade_flush flush, void *ctx,
                                            const char *str, apr_size_t nbyte);

/**
 * This function writes multiple strings into a bucket brigade.
 * @param b The bucket brigade to add to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param vec The strings to add (address plus length for each)
 * @param nvec The number of entries in iovec
 * @return APR_SUCCESS or error code
 */
APU_DECLARE(apr_status_t) apr_brigade_writev(apr_bucket_brigade *b,
                                             apr_brigade_flush flush,
                                             void *ctx,
                                             const struct iovec *vec,
                                             apr_size_t nvec);

/**
 * This function writes a string into a bucket brigade.
 * @param bb The bucket brigade to add to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param str The string to add
 * @return APR_SUCCESS or error code
 */
APU_DECLARE(apr_status_t) apr_brigade_puts(apr_bucket_brigade *bb,
                                           apr_brigade_flush flush, void *ctx,
                                           const char *str);

/**
 * This function writes a character into a bucket brigade.
 * @param b The bucket brigade to add to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param c The character to add
 * @return APR_SUCCESS or error code
 */
APU_DECLARE(apr_status_t) apr_brigade_putc(apr_bucket_brigade *b,
                                           apr_brigade_flush flush, void *ctx,
                                           const char c);

/**
 * This function writes an unspecified number of strings into a bucket brigade.
 * @param b The bucket brigade to add to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param ... The strings to add
 * @return APR_SUCCESS or error code
 */
APU_DECLARE_NONSTD(apr_status_t) apr_brigade_putstrs(apr_bucket_brigade *b,
                                                     apr_brigade_flush flush,
                                                     void *ctx, ...);

/**
 * Evaluate a printf and put the resulting string at the end 
 * of the bucket brigade.
 * @param b The brigade to write to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param fmt The format of the string to write
 * @param ... The arguments to fill out the format
 * @return APR_SUCCESS or error code
 */
APU_DECLARE_NONSTD(apr_status_t) apr_brigade_printf(apr_bucket_brigade *b, 
                                                    apr_brigade_flush flush,
                                                    void *ctx,
                                                    const char *fmt, ...)
        __attribute__((format(printf,4,5)));

/**
 * Evaluate a printf and put the resulting string at the end 
 * of the bucket brigade.
 * @param b The brigade to write to
 * @param flush The flush function to use if the brigade is full
 * @param ctx The structure to pass to the flush function
 * @param fmt The format of the string to write
 * @param va The arguments to fill out the format
 * @return APR_SUCCESS or error code
 */
APU_DECLARE(apr_status_t) apr_brigade_vprintf(apr_bucket_brigade *b, 
                                              apr_brigade_flush flush,
                                              void *ctx,
                                              const char *fmt, va_list va);

/**
 * Utility function to insert a file (or a segment of a file) onto the
 * end of the brigade.  The file is split into multiple buckets if it
 * is larger than the maximum size which can be represented by a
 * single bucket.
 * @param bb the brigade to insert into
 * @param f the file to insert
 * @param start the offset of the start of the segment
 * @param len the length of the segment of the file to insert
 * @param p pool from which file buckets are allocated
 * @return the last bucket inserted
 */
APU_DECLARE(apr_bucket *) apr_brigade_insert_file(apr_bucket_brigade *bb,
                                                  apr_file_t *f,
                                                  apr_off_t start,
                                                  apr_off_t len,
                                                  apr_pool_t *p);



/*  *****  Bucket freelist functions *****  */
/**
 * Create a bucket allocator.
 * @param p This pool's underlying apr_allocator_t is used to allocate memory
 *          for the bucket allocator.  When the pool is destroyed, the bucket
 *          allocator's cleanup routine will free all memory that has been
 *          allocated from it.
 * @remark  The reason the allocator gets its memory from the pool's
 *          apr_allocator_t rather than from the pool itself is because
 *          the bucket allocator will free large memory blocks back to the
 *          allocator when it's done with them, thereby preventing memory
 *          footprint growth that would occur if we allocated from the pool.
 * @warning The allocator must never be used by more than one thread at a time.
 */
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p);

/**
 * Create a bucket allocator.
 * @param allocator This apr_allocator_t is used to allocate both the bucket
 *          allocator and all memory handed out by the bucket allocator.  The
 *          caller is responsible for destroying the bucket allocator and the
 *          apr_allocator_t -- no automatic cleanups will happen.
 * @warning The allocator must never be used by more than one thread at a time.
 */
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create_ex(apr_allocator_t *allocator);

/**
 * Destroy a bucket allocator.
 * @param list The allocator to be destroyed
 */
APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list);

/**
 * Get the aligned size corresponding to the requested size, but minus the
 * allocator(s) overhead such that the allocation would remain in the
 * same boundary.
 * @param list The allocator from which to the memory would be allocated.
 * @param size The requested size.
 * @return The corresponding aligned/floored size.
 */
APU_DECLARE_NONSTD(apr_size_t) apr_bucket_alloc_aligned_floor(apr_bucket_alloc_t *list,
                                                              apr_size_t size)
                         __attribute__((nonnull(1)));

/**
 * Allocate memory for use by the buckets.
 * @param size The amount to allocate.
 * @param list The allocator from which to allocate the memory.
 */
APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size, apr_bucket_alloc_t *list);

/**
 * Free memory previously allocated with apr_bucket_alloc().
 * @param block The block of memory to be freed.
 */
APU_DECLARE_NONSTD(void) apr_bucket_free(void *block);


/*  *****  Bucket Functions  *****  */
/**
 * Free the resources used by a bucket. If multiple buckets refer to
 * the same resource it is freed when the last one goes away.
 * @see apr_bucket_delete()
 * @param e The bucket to destroy
 */
#define apr_bucket_destroy(e) do {					\
        apr_bucket *apr__d = (e);					\
        apr__d->type->destroy(apr__d->data);			       	\
        apr__d->free(apr__d);						\
    } while (0)

/**
 * Delete a bucket by removing it from its brigade (if any) and then
 * destroying it.
 * @remark This mainly acts as an aid in avoiding code verbosity.  It is
 * the preferred exact equivalent to:
 * <pre>
 *      APR_BUCKET_REMOVE(e);
 *      apr_bucket_destroy(e);
 * </pre>
 * @param e The bucket to delete
 */
#define apr_bucket_delete(e) do {					\
        apr_bucket *apr__b = (e);					\
        APR_BUCKET_REMOVE(apr__b);					\
        apr_bucket_destroy(apr__b);					\
    } while (0)

/**
 * Read some data from the bucket.
 *
 * The apr_bucket_read function returns a convenient amount of data
 * from the bucket provided, writing the address and length of the
 * data to the pointers provided by the caller. The function tries
 * as hard as possible to avoid a memory copy.
 *
 * Buckets are expected to be a member of a brigade at the time they
 * are read.
 *
 * In typical application code, buckets are read in a loop, and after
 * each bucket is read and processed, it is moved or deleted from the
 * brigade and the next bucket read.
 *
 * The definition of "convenient" depends on the type of bucket that
 * is being read, and is decided by APR. In the case of memory based
 * buckets such as heap and immortal buckets, a pointer will be
 * returned to the location of the buffer containing the complete
 * contents of the bucket.
 *
 * Some buckets, such as the socket bucket, might have no concept
 * of length. If an attempt is made to read such a bucket, the
 * apr_bucket_read function will read a convenient amount of data
 * from the socket. The socket bucket is magically morphed into a
 * heap bucket containing the just-read data, and a new socket bucket
 * is inserted just after this heap bucket.
 *
 * To understand why apr_bucket_read might do this, consider the loop
 * described above to read and process buckets. The current bucket
 * is magically morphed into a heap bucket and returned to the caller.
 * The caller processes the data, and deletes the heap bucket, moving
 * onto the next bucket, the new socket bucket. This process repeats,
 * giving the illusion of a bucket brigade that contains potentially
 * infinite amounts of data. It is up to the caller to decide at what
 * point to stop reading buckets.
 *
 * Some buckets, such as the file bucket, might have a fixed size,
 * but be significantly larger than is practical to store in RAM in
 * one go. As with the socket bucket, if an attempt is made to read
 * from a file bucket, the file bucket is magically morphed into a
 * heap bucket containing a convenient amount of data read from the
 * current offset in the file. During the read, the offset will be
 * moved forward on the file, and a new file bucket will be inserted
 * directly after the current bucket representing the remainder of the
 * file. If the heap bucket was large enough to store the whole
 * remainder of the file, no more file buckets are inserted, and the
 * file bucket will disappear completely.
 *
 * The pattern for reading buckets described above does create the
 * illusion that the code is willing to swallow buckets that might be
 * too large for the system to handle in one go. This however is just
 * an illusion: APR will always ensure that large (file) or infinite
 * (socket) buckets are broken into convenient bite sized heap buckets
 * before data is returned to the caller.
 *
 * There is a potential gotcha to watch for: if buckets are read in a
 * loop, and aren't deleted after being processed, the potentially large
 * bucket will slowly be converted into RAM resident heap buckets. If
 * the file is larger than available RAM, an out of memory condition
 * could be caused if the application is not careful to manage this.
 *
 * @param e The bucket to read from
 * @param str The location to store a pointer to the data in
 * @param len The location to store the amount of data read
 * @param block Whether the read function blocks
 */
#define apr_bucket_read(e,str,len,block) (e)->type->read(e, str, len, block)

/**
 * Setaside data so that stack data is not destroyed on returning from
 * the function
 * @param e The bucket to setaside
 * @param p The pool to setaside into
 */
#define apr_bucket_setaside(e,p) (e)->type->setaside(e,p)

/**
 * Split one bucket in two at the point provided.
 * 
 * Once split, the original bucket becomes the first of the two new buckets.
 * 
 * (It is assumed that the bucket is a member of a brigade when this
 * function is called).
 * @param e The bucket to split
 * @param point The offset to split the bucket at
 */
#define apr_bucket_split(e,point) (e)->type->split(e, point)

/**
 * Copy a bucket.
 * @param e The bucket to copy
 * @param c Returns a pointer to the new bucket
 */
#define apr_bucket_copy(e,c) (e)->type->copy(e, c)

/* Bucket type handling */

/**
 * This function simply returns APR_SUCCESS to denote that the bucket does
 * not require anything to happen for its setaside() function. This is
 * appropriate for buckets that have "immortal" data -- the data will live
 * at least as long as the bucket.
 * @param data The bucket to setaside
 * @param pool The pool defining the desired lifetime of the bucket data
 * @return APR_SUCCESS
 */ 
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data,
                                                          apr_pool_t *pool);

/**
 * A place holder function that signifies that the setaside function was not
 * implemented for this bucket
 * @param data The bucket to setaside
 * @param pool The pool defining the desired lifetime of the bucket data
 * @return APR_ENOTIMPL
 */ 
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data,
                                                             apr_pool_t *pool);

/**
 * A place holder function that signifies that the split function was not
 * implemented for this bucket
 * @param data The bucket to split
 * @param point The location to split the bucket
 * @return APR_ENOTIMPL
 */ 
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_split_notimpl(apr_bucket *data,
                                                          apr_size_t point);

/**
 * A place holder function that signifies that the copy function was not
 * implemented for this bucket
 * @param e The bucket to copy
 * @param c Returns a pointer to the new bucket
 * @return APR_ENOTIMPL
 */
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e,
                                                         apr_bucket **c);

/**
 * A place holder function that signifies that this bucket does not need
 * to do anything special to be destroyed.  That's only the case for buckets
 * that either have no data (metadata buckets) or buckets whose data pointer
 * points to something that's not a bucket-type-specific structure, as with
 * simple buckets where data points to a string and pipe buckets where data
 * points directly to the apr_file_t.
 * @param data The bucket data to destroy
 */ 
APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data);

/**
 * There is no apr_bucket_destroy_notimpl, because destruction is required
 * to be implemented (it could be a noop, but only if that makes sense for
 * the bucket type)
 */

/* There is no apr_bucket_read_notimpl, because it is a required function
 */


/* All of the bucket types implemented by the core */
/**
 * The flush bucket type.  This signifies that all data should be flushed to
 * the next filter.  The flush bucket should be sent with the other buckets.
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_flush;
/**
 * The EOS bucket type.  This signifies that there will be no more data, ever.
 * All filters MUST send all data to the next filter when they receive a
 * bucket of this type
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_eos;
/**
 * The FILE bucket type.  This bucket represents a file on disk
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_file;
/**
 * The HEAP bucket type.  This bucket represents a data allocated from the
 * heap.
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_heap;
#if APR_HAS_MMAP
/**
 * The MMAP bucket type.  This bucket represents an MMAP'ed file
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_mmap;
#endif
/**
 * The POOL bucket type.  This bucket represents a data that was allocated
 * from a pool.  IF this bucket is still available when the pool is cleared,
 * the data is copied on to the heap.
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_pool;
/**
 * The PIPE bucket type.  This bucket represents a pipe to another program.
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_pipe;
/**
 * The IMMORTAL bucket type.  This bucket represents a segment of data that
 * the creator is willing to take responsibility for.  The core will do
 * nothing with the data in an immortal bucket
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_immortal;
/**
 * The TRANSIENT bucket type.  This bucket represents a data allocated off
 * the stack.  When the setaside function is called, this data is copied on
 * to the heap
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_transient;
/**
 * The SOCKET bucket type.  This bucket represents a socket to another machine
 */
APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_socket;


/*  *****  Simple buckets  *****  */

/**
 * Split a simple bucket into two at the given point.  Most non-reference
 * counting buckets that allow multiple references to the same block of
 * data (eg transient and immortal) will use this as their split function
 * without any additional type-specific handling.
 * @param b The bucket to be split
 * @param point The offset of the first byte in the new bucket
 * @return APR_EINVAL if the point is not within the bucket;
 *         APR_ENOMEM if allocation failed;
 *         or APR_SUCCESS
 */
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *b,
                                                         apr_size_t point);

/**
 * Copy a simple bucket.  Most non-reference-counting buckets that allow
 * multiple references to the same block of data (eg transient and immortal)
 * will use this as their copy function without any additional type-specific
 * handling.
 * @param a The bucket to copy
 * @param b Returns a pointer to the new bucket
 * @return APR_ENOMEM if allocation failed;
 *         or APR_SUCCESS
 */
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a,
                                                        apr_bucket **b);


/*  *****  Shared, reference-counted buckets  *****  */

/**
 * Initialize a bucket containing reference-counted data that may be
 * shared. The caller must allocate the bucket if necessary and
 * initialize its type-dependent fields, and allocate and initialize
 * its own private data structure. This function should only be called
 * by type-specific bucket creation functions.
 * @param b The bucket to initialize
 * @param data A pointer to the private data structure
 *             with the reference count at the start
 * @param start The start of the data in the bucket
 *              relative to the private base pointer
 * @param length The length of the data in the bucket
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_shared_make(apr_bucket *b, void *data,
				                 apr_off_t start, 
                                                 apr_size_t length);

/**
 * Decrement the refcount of the data in the bucket. This function
 * should only be called by type-specific bucket destruction functions.
 * @param data The private data pointer from the bucket to be destroyed
 * @return TRUE or FALSE; TRUE if the reference count is now
 *         zero, indicating that the shared resource itself can
 *         be destroyed by the caller.
 */
APU_DECLARE(int) apr_bucket_shared_destroy(void *data);

/**
 * Split a bucket into two at the given point, and adjust the refcount
 * to the underlying data. Most reference-counting bucket types will
 * be able to use this function as their split function without any
 * additional type-specific handling.
 * @param b The bucket to be split
 * @param point The offset of the first byte in the new bucket
 * @return APR_EINVAL if the point is not within the bucket;
 *         APR_ENOMEM if allocation failed;
 *         or APR_SUCCESS
 */
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_split(apr_bucket *b,
                                                         apr_size_t point);

/**
 * Copy a refcounted bucket, incrementing the reference count. Most
 * reference-counting bucket types will be able to use this function
 * as their copy function without any additional type-specific handling.
 * @param a The bucket to copy
 * @param b Returns a pointer to the new bucket
 * @return APR_ENOMEM if allocation failed;
           or APR_SUCCESS
 */
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_copy(apr_bucket *a,
                                                        apr_bucket **b);


/*  *****  Functions to Create Buckets of varying types  *****  */
/*
 * Each bucket type foo has two initialization functions:
 * apr_bucket_foo_make which sets up some already-allocated memory as a
 * bucket of type foo; and apr_bucket_foo_create which allocates memory
 * for the bucket, calls apr_bucket_make_foo, and initializes the
 * bucket's list pointers. The apr_bucket_foo_make functions are used
 * inside the bucket code to change the type of buckets in place;
 * other code should call apr_bucket_foo_create. All the initialization
 * functions change nothing if they fail.
 */

/**
 * Create an End of Stream bucket.  This indicates that there is no more data
 * coming from down the filter stack.  All filters should flush at this point.
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_eos_create(apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in an EOS bucket.  This indicates that there is no 
 * more data coming from down the filter stack.  All filters should flush at 
 * this point.
 * @param b The bucket to make into an EOS bucket
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_eos_make(apr_bucket *b);

/**
 * Create a flush  bucket.  This indicates that filters should flush their
 * data.  There is no guarantee that they will flush it, but this is the
 * best we can do.
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_flush_create(apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in a FLUSH  bucket.  This indicates that filters 
 * should flush their data.  There is no guarantee that they will flush it, 
 * but this is the best we can do.
 * @param b The bucket to make into a FLUSH bucket
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_flush_make(apr_bucket *b);

/**
 * Create a bucket referring to long-lived data.
 * @param buf The data to insert into the bucket
 * @param nbyte The size of the data to insert.
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_immortal_create(const char *buf, 
                                                     apr_size_t nbyte,
                                                     apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in a bucket refer to long-lived data
 * @param b The bucket to make into a IMMORTAL bucket
 * @param buf The data to insert into the bucket
 * @param nbyte The size of the data to insert.
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_immortal_make(apr_bucket *b, 
                                                   const char *buf, 
                                                   apr_size_t nbyte);

/**
 * Create a bucket referring to data on the stack.
 * @param buf The data to insert into the bucket
 * @param nbyte The size of the data to insert.
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_transient_create(const char *buf, 
                                                      apr_size_t nbyte,
                                                      apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in a bucket refer to stack data
 * @param b The bucket to make into a TRANSIENT bucket
 * @param buf The data to insert into the bucket
 * @param nbyte The size of the data to insert.
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_transient_make(apr_bucket *b, 
                                                    const char *buf,
                                                    apr_size_t nbyte);

/**
 * Create a bucket referring to memory on the heap. If the caller asks
 * for the data to be copied, this function always allocates 4K of
 * memory so that more data can be added to the bucket without
 * requiring another allocation. Therefore not all the data may be put
 * into the bucket. If copying is not requested then the bucket takes
 * over responsibility for free()ing the memory.
 * @param buf The buffer to insert into the bucket
 * @param nbyte The size of the buffer to insert.
 * @param free_func Function to use to free the data; NULL indicates that the
 *                  bucket should make a copy of the data
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf, 
                                                 apr_size_t nbyte,
                                                 void (*free_func)(void *data),
                                                 apr_bucket_alloc_t *list);
/**
 * Make the bucket passed in a bucket refer to heap data
 * @param b The bucket to make into a HEAP bucket
 * @param buf The buffer to insert into the bucket
 * @param nbyte The size of the buffer to insert.
 * @param free_func Function to use to free the data; NULL indicates that the
 *                  bucket should make a copy of the data
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
                                               apr_size_t nbyte,
                                               void (*free_func)(void *data));

/**
 * Create a bucket referring to memory allocated from a pool.
 *
 * @param buf The buffer to insert into the bucket
 * @param length The number of bytes referred to by this bucket
 * @param pool The pool the memory was allocated from
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_pool_create(const char *buf, 
                                                 apr_size_t length,
                                                 apr_pool_t *pool,
                                                 apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in a bucket refer to pool data
 * @param b The bucket to make into a pool bucket
 * @param buf The buffer to insert into the bucket
 * @param length The number of bytes referred to by this bucket
 * @param pool The pool the memory was allocated from
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b, const char *buf,
                                               apr_size_t length, 
                                               apr_pool_t *pool);

#if APR_HAS_MMAP
/**
 * Create a bucket referring to mmap()ed memory.
 * @param mm The mmap to insert into the bucket
 * @param start The offset of the first byte in the mmap
 *              that this bucket refers to
 * @param length The number of bytes referred to by this bucket
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_mmap_create(apr_mmap_t *mm, 
                                                 apr_off_t start,
                                                 apr_size_t length,
                                                 apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in a bucket refer to an MMAP'ed file
 * @param b The bucket to make into a MMAP bucket
 * @param mm The mmap to insert into the bucket
 * @param start The offset of the first byte in the mmap
 *              that this bucket refers to
 * @param length The number of bytes referred to by this bucket
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_mmap_make(apr_bucket *b, apr_mmap_t *mm,
                                               apr_off_t start, 
                                               apr_size_t length);
#endif

/**
 * Create a bucket referring to a socket.
 * @param thissock The socket to put in the bucket
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_socket_create(apr_socket_t *thissock,
                                                   apr_bucket_alloc_t *list);
/**
 * Make the bucket passed in a bucket refer to a socket
 * @param b The bucket to make into a SOCKET bucket
 * @param thissock The socket to put in the bucket
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_socket_make(apr_bucket *b, 
                                                 apr_socket_t *thissock);

/**
 * Create a bucket referring to a pipe.
 * @param thispipe The pipe to put in the bucket
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_pipe_create(apr_file_t *thispipe,
                                                 apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in a bucket refer to a pipe
 * @param b The bucket to make into a PIPE bucket
 * @param thispipe The pipe to put in the bucket
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_pipe_make(apr_bucket *b, 
                                               apr_file_t *thispipe);

/**
 * Create a bucket referring to a file.
 * @param fd The file to put in the bucket
 * @param offset The offset where the data of interest begins in the file
 * @param len The amount of data in the file we are interested in
 * @param p The pool into which any needed structures should be created
 *          while reading from this file bucket
 * @param list The freelist from which this bucket should be allocated
 * @return The new bucket, or NULL if allocation failed
 * @remark If the file is truncated such that the segment of the file
 * referenced by the bucket no longer exists, an attempt to read
 * from the bucket will fail with APR_EOF. 
 * @remark apr_brigade_insert_file() should generally be used to
 * insert files into brigades, since that function can correctly
 * handle large file issues.
 */
APU_DECLARE(apr_bucket *) apr_bucket_file_create(apr_file_t *fd,
                                                 apr_off_t offset,
                                                 apr_size_t len, 
                                                 apr_pool_t *p,
                                                 apr_bucket_alloc_t *list);

/**
 * Make the bucket passed in a bucket refer to a file
 * @param b The bucket to make into a FILE bucket
 * @param fd The file to put in the bucket
 * @param offset The offset where the data of interest begins in the file
 * @param len The amount of data in the file we are interested in
 * @param p The pool into which any needed structures should be created
 *          while reading from this file bucket
 * @return The new bucket, or NULL if allocation failed
 */
APU_DECLARE(apr_bucket *) apr_bucket_file_make(apr_bucket *b, apr_file_t *fd,
                                               apr_off_t offset,
                                               apr_size_t len, apr_pool_t *p);

/**
 * Enable or disable memory-mapping for a FILE bucket (default is enabled)
 * @param b The bucket
 * @param enabled Whether memory-mapping should be enabled
 * @return APR_SUCCESS normally, or an error code if the operation fails
 */
APU_DECLARE(apr_status_t) apr_bucket_file_enable_mmap(apr_bucket *b,
                                                      int enabled);

/**
 * Set the size of the read buffer allocated by a FILE bucket (default
 * is @a APR_BUCKET_BUFF_SIZE)
 * memory-mapping is disabled only)
 * @param b The bucket
 * @param size Size of the allocated buffers
 * @return APR_SUCCESS normally, or an error code if the operation fails
 * @remark Relevant/used only when memory-mapping is disabled (@see
 * apr_bucket_file_enable_mmap)
 */
APU_DECLARE(apr_status_t) apr_bucket_file_set_buf_size(apr_bucket *b,
                                                       apr_size_t size);

/** @} */
#ifdef __cplusplus
}
#endif

#endif /* !APR_BUCKETS_H */
include/apr-1/apr.h000064400000001174150336140420010043 0ustar00/* This file is here to prevent a file conflict on multiarch systems.  A
 * conflict will occur because apr.h has arch-specific definitions.
 *
 * DO NOT INCLUDE THE NEW FILE DIRECTLY -- ALWAYS INCLUDE THIS ONE INSTEAD. */

#if defined(__i386__)
#include "apr-i386.h"
#elif defined(__ia64__)
#include "apr-ia64.h"
#elif defined(__powerpc64__)
#include "apr-ppc64.h"
#elif defined(__powerpc__)
#include "apr-ppc.h"
#elif defined(__s390x__)
#include "apr-s390x.h"
#elif defined(__s390__)
#include "apr-s390.h"
#elif defined(__x86_64__)
#include "apr-x86_64.h"
#else
#error "This apr-devel package does not work your architecture?"
#endif
include/apr-1/apr_hash.h000064400000024122150336140420011044 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_HASH_H
#define APR_HASH_H

/**
 * @file apr_hash.h
 * @brief APR Hash Tables
 */

#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup apr_hash Hash Tables
 * @ingroup APR 
 * @{
 */

/**
 * When passing a key to apr_hash_set or apr_hash_get, this value can be
 * passed to indicate a string-valued key, and have apr_hash compute the
 * length automatically.
 *
 * @remark apr_hash will use strlen(key) for the length. The NUL terminator
 *         is not included in the hash value (why throw a constant in?).
 *         Since the hash table merely references the provided key (rather
 *         than copying it), apr_hash_this() will return the NUL-term'd key.
 */
#define APR_HASH_KEY_STRING     (-1)

/**
 * Abstract type for hash tables.
 */
typedef struct apr_hash_t apr_hash_t;

/**
 * Abstract type for scanning hash tables.
 */
typedef struct apr_hash_index_t apr_hash_index_t;

/**
 * Callback functions for calculating hash values.
 * @param key The key.
 * @param klen The length of the key, or APR_HASH_KEY_STRING to use the string 
 *             length. If APR_HASH_KEY_STRING then returns the actual key length.
 */
typedef unsigned int (*apr_hashfunc_t)(const char *key, apr_ssize_t *klen);

/**
 * The default hash function.
 */
APR_DECLARE_NONSTD(unsigned int) apr_hashfunc_default(const char *key,
                                                      apr_ssize_t *klen);

/**
 * Create a hash table.
 * @param pool The pool to allocate the hash table out of
 * @return The hash table just created
  */
APR_DECLARE(apr_hash_t *) apr_hash_make(apr_pool_t *pool);

/**
 * Create a hash table with a custom hash function
 * @param pool The pool to allocate the hash table out of
 * @param hash_func A custom hash function.
 * @return The hash table just created
  */
APR_DECLARE(apr_hash_t *) apr_hash_make_custom(apr_pool_t *pool, 
                                               apr_hashfunc_t hash_func);

/**
 * Make a copy of a hash table
 * @param pool The pool from which to allocate the new hash table
 * @param h The hash table to clone
 * @return The hash table just created
 * @remark Makes a shallow copy
 */
APR_DECLARE(apr_hash_t *) apr_hash_copy(apr_pool_t *pool,
                                        const apr_hash_t *h);

/**
 * Associate a value with a key in a hash table.
 * @param ht The hash table
 * @param key Pointer to the key
 * @param klen Length of the key. Can be APR_HASH_KEY_STRING to use the string length.
 * @param val Value to associate with the key
 * @remark If the value is NULL the hash entry is deleted. The key is stored as is,
 *         and so must have a lifetime at least as long as the hash table's pool.
 */
APR_DECLARE(void) apr_hash_set(apr_hash_t *ht, const void *key,
                               apr_ssize_t klen, const void *val);

/**
 * Look up the value associated with a key in a hash table.
 * @param ht The hash table
 * @param key Pointer to the key
 * @param klen Length of the key. Can be APR_HASH_KEY_STRING to use the string length.
 * @return Returns NULL if the key is not present.
 */
APR_DECLARE(void *) apr_hash_get(apr_hash_t *ht, const void *key,
                                 apr_ssize_t klen);

/**
 * Start iterating over the entries in a hash table.
 * @param p The pool to allocate the apr_hash_index_t iterator. If this
 *          pool is NULL, then an internal, non-thread-safe iterator is used.
 * @param ht The hash table
 * @return The iteration state
 * @remark  There is no restriction on adding or deleting hash entries during
 * an iteration (although the results may be unpredictable unless all you do
 * is delete the current entry) and multiple iterations can be in
 * progress at the same time.
 *
 * @par Example:
 *
 * @code
 * int sum_values(apr_pool_t *p, apr_hash_t *ht)
 * {
 *     apr_hash_index_t *hi;
 *     void *val;
 *     int sum = 0;
 *     for (hi = apr_hash_first(p, ht); hi; hi = apr_hash_next(hi)) {
 *         apr_hash_this(hi, NULL, NULL, &val);
 *         sum += *(int *)val;
 *     }
 *     return sum;
 * }
 * @endcode
 */
APR_DECLARE(apr_hash_index_t *) apr_hash_first(apr_pool_t *p, apr_hash_t *ht);

/**
 * Continue iterating over the entries in a hash table.
 * @param hi The iteration state
 * @return a pointer to the updated iteration state.  NULL if there are no more  
 *         entries.
 */
APR_DECLARE(apr_hash_index_t *) apr_hash_next(apr_hash_index_t *hi);

/**
 * Get the current entry's details from the iteration state.
 * @param hi The iteration state
 * @param key Return pointer for the pointer to the key.
 * @param klen Return pointer for the key length.
 * @param val Return pointer for the associated value.
 * @remark The return pointers should point to a variable that will be set to the
 *         corresponding data, or they may be NULL if the data isn't interesting.
 */
APR_DECLARE(void) apr_hash_this(apr_hash_index_t *hi, const void **key, 
                                apr_ssize_t *klen, void **val);

/**
 * Get the current entry's key from the iteration state.
 * @param hi The iteration state
 * @return The pointer to the key
 */
APR_DECLARE(const void*) apr_hash_this_key(apr_hash_index_t *hi);

/**
 * Get the current entry's key length from the iteration state.
 * @param hi The iteration state
 * @return The key length
 */
APR_DECLARE(apr_ssize_t) apr_hash_this_key_len(apr_hash_index_t *hi);

/**
 * Get the current entry's value from the iteration state.
 * @param hi The iteration state
 * @return The pointer to the value
 */
APR_DECLARE(void*) apr_hash_this_val(apr_hash_index_t *hi);

/**
 * Get the number of key/value pairs in the hash table.
 * @param ht The hash table
 * @return The number of key/value pairs in the hash table.
 */
APR_DECLARE(unsigned int) apr_hash_count(apr_hash_t *ht);

/**
 * Clear any key/value pairs in the hash table.
 * @param ht The hash table
 */
APR_DECLARE(void) apr_hash_clear(apr_hash_t *ht);

/**
 * Merge two hash tables into one new hash table. The values of the overlay
 * hash override the values of the base if both have the same key.  Both
 * hash tables must use the same hash function.
 * @param p The pool to use for the new hash table
 * @param overlay The table to add to the initial table
 * @param base The table that represents the initial values of the new table
 * @return A new hash table containing all of the data from the two passed in
 */
APR_DECLARE(apr_hash_t *) apr_hash_overlay(apr_pool_t *p,
                                           const apr_hash_t *overlay, 
                                           const apr_hash_t *base);

/**
 * Merge two hash tables into one new hash table. If the same key
 * is present in both tables, call the supplied merge function to
 * produce a merged value for the key in the new table.  Both
 * hash tables must use the same hash function.
 * @param p The pool to use for the new hash table
 * @param h1 The first of the tables to merge
 * @param h2 The second of the tables to merge
 * @param merger A callback function to merge values, or NULL to
 *  make values from h1 override values from h2 (same semantics as
 *  apr_hash_overlay())
 * @param data Client data to pass to the merger function
 * @return A new hash table containing all of the data from the two passed in
 */
APR_DECLARE(apr_hash_t *) apr_hash_merge(apr_pool_t *p,
                                         const apr_hash_t *h1,
                                         const apr_hash_t *h2,
                                         void * (*merger)(apr_pool_t *p,
                                                     const void *key,
                                                     apr_ssize_t klen,
                                                     const void *h1_val,
                                                     const void *h2_val,
                                                     const void *data),
                                         const void *data);

/**
 * Declaration prototype for the iterator callback function of apr_hash_do().
 *
 * @param rec The data passed as the first argument to apr_hash_[v]do()
 * @param key The key from this iteration of the hash table
 * @param klen The key length from this iteration of the hash table
 * @param value The value from this iteration of the hash table
 * @remark Iteration continues while this callback function returns non-zero.
 * To export the callback function for apr_hash_do() it must be declared 
 * in the _NONSTD convention.
 */
typedef int (apr_hash_do_callback_fn_t)(void *rec, const void *key,
                                                   apr_ssize_t klen,
                                                   const void *value);

/** 
 * Iterate over a hash table running the provided function once for every
 * element in the hash table. The @p comp function will be invoked for
 * every element in the hash table.
 *
 * @param comp The function to run
 * @param rec The data to pass as the first argument to the function
 * @param ht The hash table to iterate over
 * @return FALSE if one of the comp() iterations returned zero; TRUE if all
 *            iterations returned non-zero
 * @see apr_hash_do_callback_fn_t
 */
APR_DECLARE(int) apr_hash_do(apr_hash_do_callback_fn_t *comp,
                             void *rec, const apr_hash_t *ht);

/**
 * Get a pointer to the pool which the hash table was created in
 */
APR_POOL_DECLARE_ACCESSOR(hash);

/** @} */

#ifdef __cplusplus
}
#endif

#endif	/* !APR_HASH_H */
include/apr-1/apr_tables.h000064400000045632150336140420011404 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_TABLES_H
#define APR_TABLES_H

/**
 * @file apr_tables.h
 * @brief APR Table library
 */

#include "apr.h"
#include "apr_pools.h"

#if APR_HAVE_STDARG_H
#include <stdarg.h>     /* for va_list */
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_tables Table and Array Functions
 * @ingroup APR 
 * Arrays are used to store data which is referenced sequentially or
 * as a stack.  Functions are provided to push and pop individual
 * elements as well as to operate on the entire array.
 *
 * Tables are used to store data which can be referenced by key.
 * Limited capabilities are provided for tables with multiple elements
 * which share a key; while key lookup will return only a single
 * element, iteration is available.  Additionally, a table can be
 * compressed to resolve duplicates.
 *
 * Both arrays and tables may store string or binary data; some features,
 * such as concatenation or merging of elements, work only for string
 * data.
 * @{
 */

/** the table abstract data type */
typedef struct apr_table_t apr_table_t;

/** @see apr_array_header_t */
typedef struct apr_array_header_t apr_array_header_t;

/** An opaque array type */
struct apr_array_header_t {
    /** The pool the array is allocated out of */
    apr_pool_t *pool;
    /** The amount of memory allocated for each element of the array */
    int elt_size;
    /** The number of active elements in the array */
    int nelts;
    /** The number of elements allocated in the array */
    int nalloc;
    /** The elements in the array */
    char *elts;
};

/**
 * The (opaque) structure for string-content tables.
 */
typedef struct apr_table_entry_t apr_table_entry_t;

/** The type for each entry in a string-content table */
struct apr_table_entry_t {
    /** The key for the current table entry */
    char *key;          /* maybe NULL in future;
                         * check when iterating thru table_elts
                         */
    /** The value for the current table entry */
    char *val;

    /** A checksum for the key, for use by the apr_table internals */
    apr_uint32_t key_checksum;
};

/**
 * Get the elements from a table.
 * @param t The table
 * @return An array containing the contents of the table
 */
APR_DECLARE(const apr_array_header_t *) apr_table_elts(const apr_table_t *t);

/**
 * Determine if the table is empty (either NULL or having no elements).
 * @param t The table to check
 * @return True if empty, False otherwise
 */
APR_DECLARE(int) apr_is_empty_table(const apr_table_t *t);

/**
 * Determine if the array is empty (either NULL or having no elements).
 * @param a The array to check
 * @return True if empty, False otherwise
 */
APR_DECLARE(int) apr_is_empty_array(const apr_array_header_t *a);

/**
 * Create an array.
 * @param p The pool to allocate the memory out of
 * @param nelts the number of elements in the initial array
 * @param elt_size The size of each element in the array.
 * @return The new array
 */
APR_DECLARE(apr_array_header_t *) apr_array_make(apr_pool_t *p,
                                                 int nelts, int elt_size);

/**
 * Add a new element to an array (as a first-in, last-out stack).
 * @param arr The array to add an element to.
 * @return Location for the new element in the array.
 * @remark If there are no free spots in the array, then this function will
 *         allocate new space for the new element.
 */
APR_DECLARE(void *) apr_array_push(apr_array_header_t *arr);

/** A helper macro for accessing a member of an APR array.
 *
 * @param ary the array
 * @param i the index into the array to return
 * @param type the type of the objects stored in the array
 *
 * @return the item at index i
 */
#define APR_ARRAY_IDX(ary,i,type) (((type *)(ary)->elts)[i])

/** A helper macro for pushing elements into an APR array.
 *
 * @param ary the array
 * @param type the type of the objects stored in the array
 *
 * @return the location where the new object should be placed
 */
#define APR_ARRAY_PUSH(ary,type) (*((type *)apr_array_push(ary)))

/**
 * Remove an element from an array (as a first-in, last-out stack).
 * @param arr The array to remove an element from.
 * @return Location of the element in the array.
 * @remark If there are no elements in the array, NULL is returned.
 */
APR_DECLARE(void *) apr_array_pop(apr_array_header_t *arr);

/**
 * Remove all elements from an array.
 * @param arr The array to remove all elements from.
 * @remark As the underlying storage is allocated from a pool, no
 * memory is freed by this operation, but is available for reuse.
 */
APR_DECLARE(void) apr_array_clear(apr_array_header_t *arr);

/**
 * Concatenate two arrays together.
 * @param dst The destination array, and the one to go first in the combined 
 *            array
 * @param src The source array to add to the destination array
 */
APR_DECLARE(void) apr_array_cat(apr_array_header_t *dst,
			        const apr_array_header_t *src);

/**
 * Copy the entire array.
 * @param p The pool to allocate the copy of the array out of
 * @param arr The array to copy
 * @return An exact copy of the array passed in
 * @remark The alternate apr_array_copy_hdr() copies only the header, and arranges 
 *         for the elements to be copied if (and only if) the code subsequently
 *         does a push or arraycat.
 */
APR_DECLARE(apr_array_header_t *) apr_array_copy(apr_pool_t *p,
                                      const apr_array_header_t *arr);
/**
 * Copy the headers of the array, and arrange for the elements to be copied if
 * and only if the code subsequently does a push or arraycat.
 * @param p The pool to allocate the copy of the array out of
 * @param arr The array to copy
 * @return An exact copy of the array passed in
 * @remark The alternate apr_array_copy() copies the *entire* array.
 */
APR_DECLARE(apr_array_header_t *) apr_array_copy_hdr(apr_pool_t *p,
                                      const apr_array_header_t *arr);

/**
 * Append one array to the end of another, creating a new array in the process.
 * @param p The pool to allocate the new array out of
 * @param first The array to put first in the new array.
 * @param second The array to put second in the new array.
 * @return A new array containing the data from the two arrays passed in.
*/
APR_DECLARE(apr_array_header_t *) apr_array_append(apr_pool_t *p,
                                      const apr_array_header_t *first,
                                      const apr_array_header_t *second);

/**
 * Generate a new string from the apr_pool_t containing the concatenated 
 * sequence of substrings referenced as elements within the array.  The string 
 * will be empty if all substrings are empty or null, or if there are no 
 * elements in the array.  If sep is non-NUL, it will be inserted between 
 * elements as a separator.
 * @param p The pool to allocate the string out of
 * @param arr The array to generate the string from
 * @param sep The separator to use
 * @return A string containing all of the data in the array.
 */
APR_DECLARE(char *) apr_array_pstrcat(apr_pool_t *p,
				      const apr_array_header_t *arr,
				      const char sep);

/**
 * Make a new table.
 * @param p The pool to allocate the pool out of
 * @param nelts The number of elements in the initial table.
 * @return The new table.
 * @warning This table can only store text data
 */
APR_DECLARE(apr_table_t *) apr_table_make(apr_pool_t *p, int nelts);

/**
 * Create a new table and copy another table into it.
 * @param p The pool to allocate the new table out of
 * @param t The table to copy
 * @return A copy of the table passed in
 * @warning The table keys and respective values are not copied
 */
APR_DECLARE(apr_table_t *) apr_table_copy(apr_pool_t *p,
                                          const apr_table_t *t);

/**
 * Create a new table whose contents are deep copied from the given
 * table. A deep copy operation copies all fields, and makes copies
 * of dynamically allocated memory pointed to by the fields.
 * @param p The pool to allocate the new table out of
 * @param t The table to clone
 * @return A deep copy of the table passed in
 */
APR_DECLARE(apr_table_t *) apr_table_clone(apr_pool_t *p,
                                           const apr_table_t *t);

/**
 * Delete all of the elements from a table.
 * @param t The table to clear
 */
APR_DECLARE(void) apr_table_clear(apr_table_t *t);

/**
 * Get the value associated with a given key from the table.  After this call,
 * the data is still in the table.
 * @param t The table to search for the key
 * @param key The key to search for (case does not matter)
 * @return The value associated with the key, or NULL if the key does not exist. 
 */
APR_DECLARE(const char *) apr_table_get(const apr_table_t *t, const char *key);

/**
 * Get values associated with a given key from the table.      If more than one
 * value exists, return a comma separated list of values.  After this call, the
 * data is still in the table.
 * @param p The pool to allocate the combined value from, if necessary
 * @param t The table to search for the key
 * @param key The key to search for (case does not matter)
 * @return The value associated with the key, or NULL if the key does not exist.
 */
APR_DECLARE(const char *) apr_table_getm(apr_pool_t *p, const apr_table_t *t,
                                         const char *key);

/**
 * Add a key/value pair to a table.  If another element already exists with the
 * same key, this will overwrite the old data.
 * @param t The table to add the data to.
 * @param key The key to use (case does not matter)
 * @param val The value to add
 * @remark When adding data, this function makes a copy of both the key and the
 *         value.
 */
APR_DECLARE(void) apr_table_set(apr_table_t *t, const char *key,
                                const char *val);

/**
 * Add a key/value pair to a table.  If another element already exists with the
 * same key, this will overwrite the old data.
 * @param t The table to add the data to.
 * @param key The key to use (case does not matter)
 * @param val The value to add
 * @warning When adding data, this function does not make a copy of the key or 
 *          the value, so care should be taken to ensure that the values will 
 *          not change after they have been added..
 */
APR_DECLARE(void) apr_table_setn(apr_table_t *t, const char *key,
                                 const char *val);

/**
 * Remove data from the table.
 * @param t The table to remove data from
 * @param key The key of the data being removed (case does not matter)
 */
APR_DECLARE(void) apr_table_unset(apr_table_t *t, const char *key);

/**
 * Add data to a table by merging the value with data that has already been 
 * stored. The merging is done by concatenating the two values, separated
 * by the string ", ".
 * @param t The table to search for the data
 * @param key The key to merge data for (case does not matter)
 * @param val The data to add
 * @remark If the key is not found, then this function acts like apr_table_add()
 */
APR_DECLARE(void) apr_table_merge(apr_table_t *t, const char *key,
                                  const char *val);

/**
 * Add data to a table by merging the value with data that has already been 
 * stored. The merging is done by concatenating the two values, separated
 * by the string ", ".
 * @param t The table to search for the data
 * @param key The key to merge data for (case does not matter)
 * @param val The data to add
 * @remark If the key is not found, then this function acts like apr_table_addn()
 */
APR_DECLARE(void) apr_table_mergen(apr_table_t *t, const char *key,
                                   const char *val);

/**
 * Add data to a table, regardless of whether there is another element with the
 * same key.
 * @param t The table to add to
 * @param key The key to use
 * @param val The value to add.
 * @remark When adding data, this function makes a copy of both the key and the
 *         value.
 */
APR_DECLARE(void) apr_table_add(apr_table_t *t, const char *key,
                                const char *val);

/**
 * Add data to a table, regardless of whether there is another element with the
 * same key.
 * @param t The table to add to
 * @param key The key to use
 * @param val The value to add.
 * @remark When adding data, this function does not make a copy of the key or the
 *         value, so care should be taken to ensure that the values will not 
 *         change after they have been added.
 */
APR_DECLARE(void) apr_table_addn(apr_table_t *t, const char *key,
                                 const char *val);

/**
 * Merge two tables into one new table.
 * @param p The pool to use for the new table
 * @param overlay The first table to put in the new table
 * @param base The table to add at the end of the new table
 * @return A new table containing all of the data from the two passed in
 */
APR_DECLARE(apr_table_t *) apr_table_overlay(apr_pool_t *p,
                                             const apr_table_t *overlay,
                                             const apr_table_t *base);

/**
 * Declaration prototype for the iterator callback function of apr_table_do()
 * and apr_table_vdo().
 * @param rec The data passed as the first argument to apr_table_[v]do()
 * @param key The key from this iteration of the table
 * @param value The value from this iteration of the table
 * @remark Iteration continues while this callback function returns non-zero.
 * To export the callback function for apr_table_[v]do() it must be declared 
 * in the _NONSTD convention.
 * @see apr_table_do @see apr_table_vdo
 */
typedef int (apr_table_do_callback_fn_t)(void *rec, const char *key, 
                                                    const char *value);

/** 
 * Iterate over a table running the provided function once for every
 * element in the table.  The varargs array must be a list of zero or
 * more (char *) keys followed by a NULL pointer.  If zero keys are
 * given, the @p comp function will be invoked for every element
 * in the table.  Otherwise, the function is invoked only for those
 * elements matching the keys specified.
 *
 * If an invocation of the @p comp function returns zero,
 * iteration will continue using the next specified key, if any.
 *
 * @param comp The function to run
 * @param rec The data to pass as the first argument to the function
 * @param t The table to iterate over
 * @param ... A varargs array of zero or more (char *) keys followed by NULL
 * @return FALSE if one of the comp() iterations returned zero; TRUE if all
 *            iterations returned non-zero
 * @see apr_table_do_callback_fn_t @see apr_table_vdo
 */
APR_DECLARE_NONSTD(int) apr_table_do(apr_table_do_callback_fn_t *comp,
                                     void *rec, const apr_table_t *t, ...)
#if defined(__GNUC__) && __GNUC__ >= 4
    __attribute__((sentinel))
#endif
    ;

/** 
 * Iterate over a table running the provided function once for every
 * element in the table.  The @p vp varargs parameter must be a
 * list of zero or more (char *) keys followed by a NULL pointer.  If
 * zero keys are given, the @p comp function will be invoked for
 * every element in the table.  Otherwise, the function is invoked
 * only for those elements matching the keys specified.
 *
 * If an invocation of the @p comp function returns zero,
 * iteration will continue using the next specified key, if any.
 *
 * @param comp The function to run
 * @param rec The data to pass as the first argument to the function
 * @param t The table to iterate over
 * @param vp List of zero or more (char *) keys followed by NULL
 * @return FALSE if one of the comp() iterations returned zero; TRUE if all
 *            iterations returned non-zero
 * @see apr_table_do_callback_fn_t @see apr_table_do
 */
APR_DECLARE(int) apr_table_vdo(apr_table_do_callback_fn_t *comp,
                               void *rec, const apr_table_t *t, va_list vp);

/** flag for overlap to use apr_table_setn */
#define APR_OVERLAP_TABLES_SET   (0)
/** flag for overlap to use apr_table_mergen */
#define APR_OVERLAP_TABLES_MERGE (1)
/** flag for overlap to use apr_table_addn */
#define APR_OVERLAP_TABLES_ADD   (2)
/**
 * For each element in table b, either use setn or mergen to add the data
 * to table a.  Which method is used is determined by the flags passed in.
 * @param a The table to add the data to.
 * @param b The table to iterate over, adding its data to table a
 * @param flags How to add the table to table a.  One of:
 *          APR_OVERLAP_TABLES_SET        Use apr_table_setn
 *          APR_OVERLAP_TABLES_MERGE      Use apr_table_mergen
 *          APR_OVERLAP_TABLES_ADD        Use apr_table_addn
 * @remark  When merging duplicates, the two values are concatenated,
 *          separated by the string ", ".
 * @remark  This function is highly optimized, and uses less memory and CPU cycles
 *          than a function that just loops through table b calling other functions.
 */
/**
 * Conceptually, apr_table_overlap does this:
 *
 * <pre>
 *  apr_array_header_t *barr = apr_table_elts(b);
 *  apr_table_entry_t *belt = (apr_table_entry_t *)barr->elts;
 *  int i;
 *
 *  for (i = 0; i < barr->nelts; ++i) {
 *      if (flags & APR_OVERLAP_TABLES_MERGE) {
 *          apr_table_mergen(a, belt[i].key, belt[i].val);
 *      }
 *      else if (flags & APR_OVERLAP_TABLES_ADD) {
 *          apr_table_addn(a, belt[i].key, belt[i].val);
 *      }
 *      else {
 *          apr_table_setn(a, belt[i].key, belt[i].val);
 *      }
 *  }
 * </pre>
 *
 *  Except that it is more efficient (less space and cpu-time) especially
 *  when b has many elements.
 *
 *  Notice the assumptions on the keys and values in b -- they must be
 *  in an ancestor of a's pool.  In practice b and a are usually from
 *  the same pool.
 */

APR_DECLARE(void) apr_table_overlap(apr_table_t *a, const apr_table_t *b,
                                     unsigned flags);

/**
 * Eliminate redundant entries in a table by either overwriting
 * or merging duplicates.
 *
 * @param t Table.
 * @param flags APR_OVERLAP_TABLES_MERGE to merge, or
 *              APR_OVERLAP_TABLES_SET to overwrite, or
 *              APR_OVERLAP_TABLES_ADD to add
 * @remark When merging duplicates, the two values are concatenated,
 *         separated by the string ", ".
 */
APR_DECLARE(void) apr_table_compress(apr_table_t *t, unsigned flags);

/** @} */

#ifdef __cplusplus
}
#endif

#endif	/* ! APR_TABLES_H */
include/apr-1/apr_anylock.h000064400000011672150336140420011567 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file apr_anylock.h
 * @brief APR-Util transparent any lock flavor wrapper
 */
#ifndef APR_ANYLOCK_H
#define APR_ANYLOCK_H

#include "apr_proc_mutex.h"
#include "apr_thread_mutex.h"
#include "apr_thread_rwlock.h"

/** Structure that may contain any APR lock type */
typedef struct apr_anylock_t {
    /** Indicates what type of lock is in lock */
    enum tm_lock {
        apr_anylock_none,           /**< None */
        apr_anylock_procmutex,      /**< Process-based */
        apr_anylock_threadmutex,    /**< Thread-based */
        apr_anylock_readlock,       /**< Read lock */
        apr_anylock_writelock       /**< Write lock */
    } type;
    /** Union of all possible APR locks */
    union apr_anylock_u_t {
        apr_proc_mutex_t *pm;       /**< Process mutex */
#if APR_HAS_THREADS
        apr_thread_mutex_t *tm;     /**< Thread mutex */
        apr_thread_rwlock_t *rw;    /**< Read-write lock */
#endif
    } lock;
} apr_anylock_t;

#if APR_HAS_THREADS

/** Lock an apr_anylock_t structure */
#define APR_ANYLOCK_LOCK(lck)                \
    (((lck)->type == apr_anylock_none)         \
      ? APR_SUCCESS                              \
      : (((lck)->type == apr_anylock_threadmutex)  \
          ? apr_thread_mutex_lock((lck)->lock.tm)    \
          : (((lck)->type == apr_anylock_procmutex)    \
              ? apr_proc_mutex_lock((lck)->lock.pm)      \
              : (((lck)->type == apr_anylock_readlock)     \
                  ? apr_thread_rwlock_rdlock((lck)->lock.rw) \
                  : (((lck)->type == apr_anylock_writelock)    \
                      ? apr_thread_rwlock_wrlock((lck)->lock.rw) \
                      : APR_EINVAL)))))

#else /* APR_HAS_THREADS */

#define APR_ANYLOCK_LOCK(lck)                \
    (((lck)->type == apr_anylock_none)         \
      ? APR_SUCCESS                              \
          : (((lck)->type == apr_anylock_procmutex)    \
              ? apr_proc_mutex_lock((lck)->lock.pm)      \
                      : APR_EINVAL))

#endif /* APR_HAS_THREADS */

#if APR_HAS_THREADS

/** Try to lock an apr_anylock_t structure */
#define APR_ANYLOCK_TRYLOCK(lck)                \
    (((lck)->type == apr_anylock_none)            \
      ? APR_SUCCESS                                 \
      : (((lck)->type == apr_anylock_threadmutex)     \
          ? apr_thread_mutex_trylock((lck)->lock.tm)    \
          : (((lck)->type == apr_anylock_procmutex)       \
              ? apr_proc_mutex_trylock((lck)->lock.pm)      \
              : (((lck)->type == apr_anylock_readlock)        \
                  ? apr_thread_rwlock_tryrdlock((lck)->lock.rw) \
                  : (((lck)->type == apr_anylock_writelock)       \
                      ? apr_thread_rwlock_trywrlock((lck)->lock.rw) \
                          : APR_EINVAL)))))

#else /* APR_HAS_THREADS */

#define APR_ANYLOCK_TRYLOCK(lck)                \
    (((lck)->type == apr_anylock_none)            \
      ? APR_SUCCESS                                 \
          : (((lck)->type == apr_anylock_procmutex)       \
              ? apr_proc_mutex_trylock((lck)->lock.pm)      \
                          : APR_EINVAL))

#endif /* APR_HAS_THREADS */

#if APR_HAS_THREADS

/** Unlock an apr_anylock_t structure */
#define APR_ANYLOCK_UNLOCK(lck)              \
    (((lck)->type == apr_anylock_none)         \
      ? APR_SUCCESS                              \
      : (((lck)->type == apr_anylock_threadmutex)  \
          ? apr_thread_mutex_unlock((lck)->lock.tm)  \
          : (((lck)->type == apr_anylock_procmutex)    \
              ? apr_proc_mutex_unlock((lck)->lock.pm)    \
              : ((((lck)->type == apr_anylock_readlock) || \
                  ((lck)->type == apr_anylock_writelock))    \
                  ? apr_thread_rwlock_unlock((lck)->lock.rw)   \
                      : APR_EINVAL))))

#else /* APR_HAS_THREADS */

#define APR_ANYLOCK_UNLOCK(lck)              \
    (((lck)->type == apr_anylock_none)         \
      ? APR_SUCCESS                              \
          : (((lck)->type == apr_anylock_procmutex)    \
              ? apr_proc_mutex_unlock((lck)->lock.pm)    \
                      : APR_EINVAL))

#endif /* APR_HAS_THREADS */

#endif /* !APR_ANYLOCK_H */
include/apr-1/apr_md4.h000064400000010655150336140420010613 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* This is derived from material copyright RSA Data Security, Inc.
 * Their notice is reproduced below in its entirety.
 *
 * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
 * rights reserved.
 *
 * License to copy and use this software is granted provided that it
 * is identified as the "RSA Data Security, Inc. MD4 Message-Digest
 * Algorithm" in all material mentioning or referencing this software
 * or this function.
 *
 * License is also granted to make and use derivative works provided
 * that such works are identified as "derived from the RSA Data
 * Security, Inc. MD4 Message-Digest Algorithm" in all material
 * mentioning or referencing the derived work.
 *
 * RSA Data Security, Inc. makes no representations concerning either
 * the merchantability of this software or the suitability of this
 * software for any particular purpose. It is provided "as is"
 * without express or implied warranty of any kind.
 *
 * These notices must be retained in any copies of any part of this
 * documentation and/or software.
 */

#ifndef APR_MD4_H
#define APR_MD4_H

#include "apu.h"
#include "apr_xlate.h"
/**
 * @file apr_md4.h
 * @brief APR-UTIL MD4 Library
 */
#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup APR_Util_MD4 MD4 Library
 * @ingroup APR_Util
 * @{
 */

/** The digestsize for MD4 */
#define APR_MD4_DIGESTSIZE 16

/** @see apr_md4_ctx_t */
typedef struct apr_md4_ctx_t apr_md4_ctx_t;

/** MD4 context. */
struct apr_md4_ctx_t {
    /** state (ABCD) */
    apr_uint32_t state[4];
    /** number of bits, modulo 2^64 (lsb first) */
    apr_uint32_t count[2];
    /** input buffer */
    unsigned char buffer[64];
#if APR_HAS_XLATE
    /** translation handle */
    apr_xlate_t *xlate;
#endif
};

/**
 * MD4 Initialize.  Begins an MD4 operation, writing a new context.
 * @param context The MD4 context to initialize.
 */
APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context);

#if APR_HAS_XLATE
/**
 * MDr4 translation setup.  Provides the APR translation handle to be used 
 * for translating the content before calculating the digest.
 * @param context The MD4 content to set the translation for.
 * @param xlate The translation handle to use for this MD4 context 
 */
APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
                                            apr_xlate_t *xlate);
#else
#define apr_md4_set_xlate(context, xlate) APR_ENOTIMPL
#endif

/**
 * MD4 block update operation.  Continue an MD4 message-digest operation, 
 * processing another message block, and updating the context.
 * @param context The MD4 content to update.
 * @param input next message block to update
 * @param inputLen The length of the next message block
 */
APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
                                         const unsigned char *input,
                                         apr_size_t inputLen);

/**
 * MD4 finalization.  Ends an MD4 message-digest operation, writing the 
 * message digest and zeroing the context
 * @param digest The final MD4 digest
 * @param context The MD4 content we are finalizing.
 */
APU_DECLARE(apr_status_t) apr_md4_final(
                                    unsigned char digest[APR_MD4_DIGESTSIZE],
                                    apr_md4_ctx_t *context);

/**
 * MD4 digest computation
 * @param digest The MD4 digest
 * @param input message block to use
 * @param inputLen The length of the message block
 */
APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
                                  const unsigned char *input,
                                  apr_size_t inputLen);

/** @} */
#ifdef __cplusplus
}
#endif

#endif /* !APR_MD4_H */
include/apr-1/apr_global_mutex.h000064400000016301150336140420012603 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_GLOBAL_MUTEX_H
#define APR_GLOBAL_MUTEX_H

/**
 * @file apr_global_mutex.h
 * @brief APR Global Locking Routines
 */

#include "apr.h"
#include "apr_proc_mutex.h"    /* only for apr_lockmech_e */
#include "apr_pools.h"
#include "apr_errno.h"
#if APR_PROC_MUTEX_IS_GLOBAL
#include "apr_proc_mutex.h"
#endif
#include "apr_time.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup APR_GlobalMutex Global Locking Routines
 * @ingroup APR 
 * @{
 */

#if !APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN)

/** Opaque global mutex structure. */
typedef struct apr_global_mutex_t apr_global_mutex_t;

/*   Function definitions */

/**
 * Create and initialize a mutex that can be used to synchronize both
 * processes and threads. Note: There is considerable overhead in using
 * this API if only cross-process or cross-thread mutual exclusion is
 * required. See apr_proc_mutex.h and apr_thread_mutex.h for more
 * specialized lock routines.
 * @param mutex the memory address where the newly created mutex will be
 *        stored.
 * @param fname A file name to use if the lock mechanism requires one.  This
 *        argument should always be provided.  The lock code itself will
 *        determine if it should be used.
 * @param mech The mechanism to use for the interprocess lock, if any; one of
 * <PRE>
 *            APR_LOCK_FCNTL
 *            APR_LOCK_FLOCK
 *            APR_LOCK_SYSVSEM
 *            APR_LOCK_POSIXSEM
 *            APR_LOCK_PROC_PTHREAD
 *            APR_LOCK_DEFAULT     pick the default mechanism for the platform
 *            APR_LOCK_DEFAULT_TIMED pick the default timed mechanism
 * </PRE>
 * @param pool the pool from which to allocate the mutex.
 * @warning Check APR_HAS_foo_SERIALIZE defines to see if the platform supports
 *          APR_LOCK_foo.  Only APR_LOCK_DEFAULT is portable.
 */
APR_DECLARE(apr_status_t) apr_global_mutex_create(apr_global_mutex_t **mutex,
                                                  const char *fname,
                                                  apr_lockmech_e mech,
                                                  apr_pool_t *pool);

/**
 * Re-open a mutex in a child process.
 * @param mutex The newly re-opened mutex structure.
 * @param fname A file name to use if the mutex mechanism requires one.  This
 *              argument should always be provided.  The mutex code itself will
 *              determine if it should be used.  This filename should be the 
 *              same one that was passed to apr_global_mutex_create().
 * @param pool The pool to operate on.
 * @remark This function must be called to maintain portability, even
 *         if the underlying lock mechanism does not require it.
 */
APR_DECLARE(apr_status_t) apr_global_mutex_child_init(
                              apr_global_mutex_t **mutex,
                              const char *fname,
                              apr_pool_t *pool);

/**
 * Acquire the lock for the given mutex. If the mutex is already locked,
 * the current thread will be put to sleep until the lock becomes available.
 * @param mutex the mutex on which to acquire the lock.
 */
APR_DECLARE(apr_status_t) apr_global_mutex_lock(apr_global_mutex_t *mutex);

/**
 * Attempt to acquire the lock for the given mutex. If the mutex has already
 * been acquired, the call returns immediately with APR_EBUSY. Note: it
 * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine
 * if the return value was APR_EBUSY, for portability reasons.
 * @param mutex the mutex on which to attempt the lock acquiring.
 */
APR_DECLARE(apr_status_t) apr_global_mutex_trylock(apr_global_mutex_t *mutex);

/**
 * Attempt to acquire the lock for the given mutex until timeout expires.
 * If the acquisition time outs, the call returns with APR_TIMEUP.
 * @param mutex the mutex on which to attempt the lock acquiring.
 * @param timeout the relative timeout (microseconds).
 * @note A negative or nul timeout means immediate attempt, returning
 *       APR_TIMEUP without blocking if it the lock is already acquired.
 */
APR_DECLARE(apr_status_t) apr_global_mutex_timedlock(apr_global_mutex_t *mutex,
                                                 apr_interval_time_t timeout);

/**
 * Release the lock for the given mutex.
 * @param mutex the mutex from which to release the lock.
 */
APR_DECLARE(apr_status_t) apr_global_mutex_unlock(apr_global_mutex_t *mutex);

/**
 * Destroy the mutex and free the memory associated with the lock.
 * @param mutex the mutex to destroy.
 */
APR_DECLARE(apr_status_t) apr_global_mutex_destroy(apr_global_mutex_t *mutex);

/**
 * Return the name of the lockfile for the mutex, or NULL
 * if the mutex doesn't use a lock file
 */
APR_DECLARE(const char *) apr_global_mutex_lockfile(apr_global_mutex_t *mutex);

/**
 * Get the mechanism of the mutex, as it relates to the actual method
 * used for the underlying apr_proc_mutex_t.
 * @param mutex the mutex to get the mechanism from.
 */
APR_DECLARE(apr_lockmech_e) apr_global_mutex_mech(apr_global_mutex_t *mutex);

/**
 * Get the mechanism's name of the mutex, as it relates to the actual method
 * used for the underlying apr_proc_mutex_t.
 * @param mutex the mutex to get the mechanism's name from.
 */
APR_DECLARE(const char *) apr_global_mutex_name(apr_global_mutex_t *mutex);

/**
 * Set mutex permissions.
 */
APR_PERMS_SET_IMPLEMENT(global_mutex);

/**
 * Get the pool used by this global_mutex.
 * @return apr_pool_t the pool
 */
APR_POOL_DECLARE_ACCESSOR(global_mutex);

#else /* APR_PROC_MUTEX_IS_GLOBAL */

/* Some platforms [e.g. Win32] have cross process locks that are truly
 * global locks, since there isn't the concept of cross-process locks.
 * Define these platforms in terms of an apr_proc_mutex_t.
 */

#define apr_global_mutex_t          apr_proc_mutex_t
#define apr_global_mutex_create     apr_proc_mutex_create
#define apr_global_mutex_child_init apr_proc_mutex_child_init
#define apr_global_mutex_lock       apr_proc_mutex_lock
#define apr_global_mutex_trylock    apr_proc_mutex_trylock
#define apr_global_mutex_unlock     apr_proc_mutex_unlock
#define apr_global_mutex_destroy    apr_proc_mutex_destroy
#define apr_global_mutex_lockfile   apr_proc_mutex_lockfile
#define apr_global_mutex_mech       apr_proc_mutex_mech
#define apr_global_mutex_name       apr_proc_mutex_name
#define apr_global_mutex_perms_set  apr_proc_mutex_perms_set
#define apr_global_mutex_pool_get   apr_proc_mutex_pool_get

#endif

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ndef APR_GLOBAL_MUTEX_H */
include/apr-1/apr_want.h000064400000005616150336140420011101 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "apr.h"        /* configuration data */
/**
 * @file apr_want.h
 * @brief APR Standard Headers Support
 *
 * <PRE>
 * Features:
 *
 *   APR_WANT_STRFUNC:  strcmp, strcat, strcpy, etc
 *   APR_WANT_MEMFUNC:  memcmp, memcpy, etc
 *   APR_WANT_STDIO:    <stdio.h> and related bits
 *   APR_WANT_IOVEC:    struct iovec
 *   APR_WANT_BYTEFUNC: htons, htonl, ntohl, ntohs
 *
 * Typical usage:
 *
 *   \#define APR_WANT_STRFUNC
 *   \#define APR_WANT_MEMFUNC
 *   \#include "apr_want.h"
 *
 * The appropriate headers will be included.
 *
 * Note: it is safe to use this in a header (it won't interfere with other
 *       headers' or source files' use of apr_want.h)
 * </PRE>
 */

/* --------------------------------------------------------------------- */

#ifdef APR_WANT_STRFUNC

#if APR_HAVE_STRING_H
#include <string.h>
#endif
#if APR_HAVE_STRINGS_H
#include <strings.h>
#endif

#undef APR_WANT_STRFUNC
#endif

/* --------------------------------------------------------------------- */

#ifdef APR_WANT_MEMFUNC

#if APR_HAVE_STRING_H
#include <string.h>
#endif

#undef APR_WANT_MEMFUNC
#endif

/* --------------------------------------------------------------------- */

#ifdef APR_WANT_STDIO

#if APR_HAVE_STDIO_H
#include <stdio.h>
#endif

#undef APR_WANT_STDIO
#endif

/* --------------------------------------------------------------------- */

#ifdef APR_WANT_IOVEC

#if APR_HAVE_IOVEC

#if APR_HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif

#else

#ifndef APR_IOVEC_DEFINED
#define APR_IOVEC_DEFINED
struct iovec
{
    void *iov_base;
    size_t iov_len;
};
#endif /* !APR_IOVEC_DEFINED */

#endif /* APR_HAVE_IOVEC */

#undef APR_WANT_IOVEC
#endif

/* --------------------------------------------------------------------- */

#ifdef APR_WANT_BYTEFUNC

/* Single Unix says they are in arpa/inet.h.  Linux has them in
 * netinet/in.h.  FreeBSD has them in arpa/inet.h but requires that
 * netinet/in.h be included first.
 */
#if APR_HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#if APR_HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif

#undef APR_WANT_BYTEFUNC
#endif

/* --------------------------------------------------------------------- */
include/apr-1/apr_shm.h000064400000022413150336140420010711 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_SHM_H
#define APR_SHM_H

/**
 * @file apr_shm.h
 * @brief APR Shared Memory Routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_perms_set.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_shm Shared Memory Routines
 * @ingroup APR 
 * @{
 */

/**
 * Private, platform-specific data struture representing a shared memory
 * segment.
 */
typedef struct apr_shm_t apr_shm_t;

/**
 * Create and make accessible a shared memory segment with default
 * properties.
 * @param m The shared memory structure to create.
 * @param reqsize The desired size of the segment.
 * @param filename The file to use for shared memory on platforms that
 *        require it.
 * @param pool the pool from which to allocate the shared memory
 *        structure.
 * @remark A note about Anonymous vs. Named shared memory segments:
 *         Not all plaforms support anonymous shared memory segments, but in
 *         some cases it is prefered over other types of shared memory
 *         implementations. Passing a NULL 'file' parameter to this function
 *         will cause the subsystem to use anonymous shared memory segments.
 *         If such a system is not available, APR_ENOTIMPL is returned.
 * @remark A note about allocation sizes:
 *         On some platforms it is necessary to store some metainformation
 *         about the segment within the actual segment. In order to supply
 *         the caller with the requested size it may be necessary for the
 *         implementation to request a slightly greater segment length
 *         from the subsystem. In all cases, the apr_shm_baseaddr_get()
 *         function will return the first usable byte of memory.
 * 
 */
APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
                                         apr_size_t reqsize,
                                         const char *filename,
                                         apr_pool_t *pool);

/**
 * Special processing flags for apr_shm_create_ex() and apr_shm_attach_ex().
 */
#define APR_SHM_NS_LOCAL    1 /* Create or attach to named shared memory
                               * segment in the "Local" namespace on
                               * Windows.  (Ignored on other platforms.)
                               * By default, the "Global" namespace is
                               * used for privileged processes and the
                               * "Local" namespace is used otherwise.
                               */
#define APR_SHM_NS_GLOBAL   2 /* Create or attach to named shared memory
                               * segment in the "Global" namespace on
                               * Windows.  (Ignored on other platforms.)
                               */

/**
 * Create and make accessible a shared memory segment with platform-
 * specific processing.
 * @param m The shared memory structure to create.
 * @param reqsize The desired size of the segment.
 * @param filename The file to use for shared memory on platforms that
 *        require it.
 * @param pool the pool from which to allocate the shared memory
 *        structure.
 * @param flags mask of APR_SHM_* (defined above)
 * @remark A note about Anonymous vs. Named shared memory segments:
 *         Not all plaforms support anonymous shared memory segments, but in
 *         some cases it is prefered over other types of shared memory
 *         implementations. Passing a NULL 'file' parameter to this function
 *         will cause the subsystem to use anonymous shared memory segments.
 *         If such a system is not available, APR_ENOTIMPL is returned.
 * @remark A note about allocation sizes:
 *         On some platforms it is necessary to store some metainformation
 *         about the segment within the actual segment. In order to supply
 *         the caller with the requested size it may be necessary for the
 *         implementation to request a slightly greater segment length
 *         from the subsystem. In all cases, the apr_shm_baseaddr_get()
 *         function will return the first usable byte of memory.
 * 
 */
APR_DECLARE(apr_status_t) apr_shm_create_ex(apr_shm_t **m,
                                            apr_size_t reqsize,
                                            const char *filename,
                                            apr_pool_t *pool,
                                            apr_int32_t flags);

/**
 * Remove named resource associated with a shared memory segment,
 * preventing attachments to the resource, but not destroying it.
 * @param filename The filename associated with shared-memory segment which
 *        needs to be removed
 * @param pool The pool used for file operations
 * @remark This function is only supported on platforms which support
 * name-based shared memory segments, and will return APR_ENOTIMPL on
 * platforms without such support.  Removing the file while the shm
 * is in use is not entirely portable, caller may use this to enhance
 * obscurity of the resource, but be prepared for the call to fail,
 * and for concurrent attempts to create a resource of the same name
 * to also fail.  The pool cleanup of apr_shm_create (apr_shm_destroy)
 * also removes the named resource.
 */
APR_DECLARE(apr_status_t) apr_shm_remove(const char *filename,
                                         apr_pool_t *pool);

/**
 * Delete named resource associated with a shared memory segment,
 * preventing attachments to the resource.
 * @param m The shared memory segment structure to delete.
 * @remark This function is only supported on platforms which support
 * name-based shared memory segments, and will return APR_ENOTIMPL on
 * platforms without such support.  Removing the file while the shm
 * is in use is not entirely portable, caller may use this to enhance
 * obscurity of the resource, but be prepared for the call to fail,
 * and for concurrent attempts to create a resource of the same name
 * to also fail.  The pool cleanup of apr_shm_create (apr_shm_destroy)
 * also removes the named resource.
 */
APR_DECLARE(apr_status_t) apr_shm_delete(apr_shm_t *m);

/**
 * Destroy a shared memory segment and associated memory.
 * @param m The shared memory segment structure to destroy.
 */
APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m);

/**
 * Attach to a shared memory segment that was created
 * by another process.
 * @param m The shared memory structure to create.
 * @param filename The file used to create the original segment.
 *        (This MUST match the original filename.)
 * @param pool the pool from which to allocate the shared memory
 *        structure for this process.
 */
APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m,
                                         const char *filename,
                                         apr_pool_t *pool);

/**
 * Attach to a shared memory segment that was created
 * by another process, with platform-specific processing.
 * @param m The shared memory structure to create.
 * @param filename The file used to create the original segment.
 *        (This MUST match the original filename.)
 * @param pool the pool from which to allocate the shared memory
 *        structure for this process.
 * @param flags mask of APR_SHM_* (defined above)
 */
APR_DECLARE(apr_status_t) apr_shm_attach_ex(apr_shm_t **m,
                                            const char *filename,
                                            apr_pool_t *pool,
                                            apr_int32_t flags);

/**
 * Detach from a shared memory segment without destroying it.
 * @param m The shared memory structure representing the segment
 *        to detach from.
 */
APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m);

/**
 * Retrieve the base address of the shared memory segment.
 * NOTE: This address is only usable within the callers address
 * space, since this API does not guarantee that other attaching
 * processes will maintain the same address mapping.
 * @param m The shared memory segment from which to retrieve
 *        the base address.
 * @return address, aligned by APR_ALIGN_DEFAULT.
 */
APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m);

/**
 * Retrieve the length of a shared memory segment in bytes.
 * @param m The shared memory segment from which to retrieve
 *        the segment length.
 */
APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m);

/**
 * Set shared memory permissions.
 */
APR_PERMS_SET_IMPLEMENT(shm);

/**
 * Get the pool used by this shared memory segment.
 */
APR_POOL_DECLARE_ACCESSOR(shm);

/** @} */ 

#ifdef __cplusplus
}
#endif

#endif  /* APR_SHM_T */
include/apr-1/apr_base64.h000064400000007404150336140420011211 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * The apr_vsnprintf/apr_snprintf functions are based on, and used with the
 * permission of, the  SIO stdio-replacement strx_* functions by Panos
 * Tsirigotis <panos@alumni.cs.colorado.edu> for xinetd.
 */

/**
 * @file apr_base64.h
 * @brief APR-UTIL Base64 Encoding
 */
#ifndef APR_BASE64_H
#define APR_BASE64_H

#include "apu.h"
#include "apr_general.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup APR_Util_Base64 Base64 Encoding
 * @ingroup APR_Util
 * @{
 */

/* Simple BASE64 encode/decode functions.
 * 
 * As we might encode binary strings, hence we require the length of
 * the incoming plain source. And return the length of what we decoded.
 *
 * The decoding function takes any non valid char (i.e. whitespace, \0
 * or anything non A-Z,0-9 etc as terminal.
 * 
 * plain strings/binary sequences are not assumed '\0' terminated. Encoded
 * strings are neither. But probably should.
 *
 */

/**
 * Given the length of an un-encoded string, get the length of the
 * encoded string.
 * @param len the length of an unencoded string.
 * @return the length of the string after it is encoded, including the
 * trailing \0
 */ 
APU_DECLARE(int) apr_base64_encode_len(int len);

/**
 * Encode a text string using base64encoding.
 * @param coded_dst The destination string for the encoded string.
 * @param plain_src The original string in plain text
 * @param len_plain_src The length of the plain text string
 * @return the length of the encoded string
 */ 
APU_DECLARE(int) apr_base64_encode(char * coded_dst, const char *plain_src, 
                                 int len_plain_src);

/**
 * Encode an EBCDIC string using base64encoding.
 * @param coded_dst The destination string for the encoded string.
 * @param plain_src The original string in plain text
 * @param len_plain_src The length of the plain text string
 * @return the length of the encoded string
 */ 
APU_DECLARE(int) apr_base64_encode_binary(char * coded_dst, 
                                        const unsigned char *plain_src,
                                        int len_plain_src);

/**
 * Determine the maximum buffer length required to decode the plain text
 * string given the encoded string.
 * @param coded_src The encoded string
 * @return the maximum required buffer length for the plain text string
 */ 
APU_DECLARE(int) apr_base64_decode_len(const char * coded_src);

/**
 * Decode a string to plain text
 * @param plain_dst The destination string for the plain text
 * @param coded_src The encoded string 
 * @return the length of the plain text string
 */ 
APU_DECLARE(int) apr_base64_decode(char * plain_dst, const char *coded_src);

/**
 * Decode an EBCDIC string to plain text
 * @param plain_dst The destination string for the plain text
 * @param coded_src The encoded string 
 * @return the length of the plain text string
 */ 
APU_DECLARE(int) apr_base64_decode_binary(unsigned char * plain_dst, 
                                        const char *coded_src);

/** @} */
#ifdef __cplusplus
}
#endif

#endif	/* !APR_BASE64_H */
include/apr-1/apr_file_io.h000064400000125606150336140420011540 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_FILE_IO_H
#define APR_FILE_IO_H

/**
 * @file apr_file_io.h
 * @brief APR File I/O Handling
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_time.h"
#include "apr_errno.h"
#include "apr_file_info.h"
#include "apr_inherit.h"

#define APR_WANT_STDIO          /**< for SEEK_* */
#define APR_WANT_IOVEC          /**< for apr_file_writev */
#include "apr_want.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_file_io File I/O Handling Functions
 * @ingroup APR 
 * @{
 */

/**
 * @defgroup apr_file_open_flags File Open Flags/Routines
 * @{
 */

/* Note to implementors: Values in the range 0x00100000--0x80000000
   are reserved for platform-specific values. */

#define APR_FOPEN_READ       0x00001  /**< Open the file for reading */
#define APR_FOPEN_WRITE      0x00002  /**< Open the file for writing */
#define APR_FOPEN_CREATE     0x00004  /**< Create the file if not there */
#define APR_FOPEN_APPEND     0x00008  /**< Append to the end of the file */
#define APR_FOPEN_TRUNCATE   0x00010  /**< Open the file and truncate
                                         to 0 length */
#define APR_FOPEN_BINARY     0x00020  /**< Open the file in binary mode
				         (This flag is ignored on UNIX 
					 because it has no meaning)*/
#define APR_FOPEN_EXCL       0x00040  /**< Open should fail if #APR_FOPEN_CREATE
                                         and file exists. */
#define APR_FOPEN_BUFFERED   0x00080  /**< Open the file for buffered I/O */
#define APR_FOPEN_DELONCLOSE 0x00100  /**< Delete the file after close */
#define APR_FOPEN_XTHREAD    0x00200  /**< Platform dependent tag to open
                                         the file for use across multiple
                                         threads */
#define APR_FOPEN_SHARELOCK  0x00400  /**< Platform dependent support for
                                         higher level locked read/write
                                         access to support writes across
                                         process/machines */
#define APR_FOPEN_NOCLEANUP  0x00800  /**< Do not register a cleanup
                                         when the file is opened. The
					 apr_os_file_t handle in apr_file_t
					 will not be closed when the pool
					 is destroyed. */
#define APR_FOPEN_SENDFILE_ENABLED 0x01000 /**< Advisory flag that this
                                             file should support
                                             apr_socket_sendfile operation */
#define APR_FOPEN_LARGEFILE   0x04000 /**< Platform dependent flag to enable
                                       * large file support, see WARNING below
                                       */
#define APR_FOPEN_SPARSE      0x08000 /**< Platform dependent flag to enable
                                       * sparse file support, see WARNING below
                                       */
#define APR_FOPEN_NONBLOCK    0x40000 /**< Platform dependent flag to enable
                                       * non blocking file io */


/* backcompat */
#define APR_READ             APR_FOPEN_READ       /**< @deprecated @see APR_FOPEN_READ */
#define APR_WRITE            APR_FOPEN_WRITE      /**< @deprecated @see APR_FOPEN_WRITE */   
#define APR_CREATE           APR_FOPEN_CREATE     /**< @deprecated @see APR_FOPEN_CREATE */   
#define APR_APPEND           APR_FOPEN_APPEND     /**< @deprecated @see APR_FOPEN_APPEND */   
#define APR_TRUNCATE         APR_FOPEN_TRUNCATE   /**< @deprecated @see APR_FOPEN_TRUNCATE */   
#define APR_BINARY           APR_FOPEN_BINARY     /**< @deprecated @see APR_FOPEN_BINARY */   
#define APR_EXCL             APR_FOPEN_EXCL       /**< @deprecated @see APR_FOPEN_EXCL */   
#define APR_BUFFERED         APR_FOPEN_BUFFERED   /**< @deprecated @see APR_FOPEN_BUFFERED */   
#define APR_DELONCLOSE       APR_FOPEN_DELONCLOSE /**< @deprecated @see APR_FOPEN_DELONCLOSE */   
#define APR_XTHREAD          APR_FOPEN_XTHREAD    /**< @deprecated @see APR_FOPEN_XTHREAD */   
#define APR_SHARELOCK        APR_FOPEN_SHARELOCK  /**< @deprecated @see APR_FOPEN_SHARELOCK */   
#define APR_FILE_NOCLEANUP   APR_FOPEN_NOCLEANUP  /**< @deprecated @see APR_FOPEN_NOCLEANUP */   
#define APR_SENDFILE_ENABLED APR_FOPEN_SENDFILE_ENABLED /**< @deprecated @see APR_FOPEN_SENDFILE_ENABLED */   
#define APR_LARGEFILE        APR_FOPEN_LARGEFILE  /**< @deprecated @see APR_FOPEN_LARGEFILE */   

/** @def APR_FOPEN_LARGEFILE 
 * @warning APR_FOPEN_LARGEFILE flag only has effect on some
 * platforms where sizeof(apr_off_t) == 4.  Where implemented, it
 * allows opening and writing to a file which exceeds the size which
 * can be represented by apr_off_t (2 gigabytes).  When a file's size
 * does exceed 2Gb, apr_file_info_get() will fail with an error on the
 * descriptor, likewise apr_stat()/apr_lstat() will fail on the
 * filename.  apr_dir_read() will fail with #APR_INCOMPLETE on a
 * directory entry for a large file depending on the particular
 * APR_FINFO_* flags.  Generally, it is not recommended to use this
 * flag.
 *
 * @def APR_FOPEN_SPARSE
 * @warning APR_FOPEN_SPARSE may, depending on platform, convert a
 * normal file to a sparse file.  Some applications may be unable
 * to decipher a sparse file, so it's critical that the sparse file
 * flag should only be used for files accessed only by APR or other
 * applications known to be able to decipher them.  APR does not
 * guarantee that it will compress the file into sparse segments
 * if it was previously created and written without the sparse flag.
 * On platforms which do not understand, or on file systems which
 * cannot handle sparse files, the flag is ignored by apr_file_open().
 *
 * @def APR_FOPEN_NONBLOCK
 * @warning APR_FOPEN_NONBLOCK is not implemented on all platforms.
 * Callers should be prepared for it to fail with #APR_ENOTIMPL.
 */

/** @} */

/**
 * @defgroup apr_file_seek_flags File Seek Flags
 * @{
 */

/* flags for apr_file_seek */
/** Set the file position */
#define APR_SET SEEK_SET
/** Current */
#define APR_CUR SEEK_CUR
/** Go to end of file */
#define APR_END SEEK_END
/** @} */

/**
 * @defgroup apr_file_attrs_set_flags File Attribute Flags
 * @{
 */

/* flags for apr_file_attrs_set */
#define APR_FILE_ATTR_READONLY   0x01          /**< File is read-only */
#define APR_FILE_ATTR_EXECUTABLE 0x02          /**< File is executable */
#define APR_FILE_ATTR_HIDDEN     0x04          /**< File is hidden */
/** @} */

/**
 * @defgroup apr_file_writev{_full} max iovec size
 * @{
 */
#if defined(DOXYGEN)
#define APR_MAX_IOVEC_SIZE 1024                /**< System dependent maximum 
                                                    size of an iovec array */
#elif defined(IOV_MAX)
#define APR_MAX_IOVEC_SIZE IOV_MAX
#elif defined(MAX_IOVEC)
#define APR_MAX_IOVEC_SIZE MAX_IOVEC
#else
#define APR_MAX_IOVEC_SIZE 1024
#endif
/** @} */

/** File attributes */
typedef apr_uint32_t apr_fileattrs_t;

/** Type to pass as whence argument to apr_file_seek. */
typedef int       apr_seek_where_t;

/**
 * Structure for referencing files.
 */
typedef struct apr_file_t         apr_file_t;

/* File lock types/flags */
/**
 * @defgroup apr_file_lock_types File Lock Types
 * @{
 */

#define APR_FLOCK_SHARED        1       /**< Shared lock. More than one process
                                           or thread can hold a shared lock
                                           at any given time. Essentially,
                                           this is a "read lock", preventing
                                           writers from establishing an
                                           exclusive lock. */
#define APR_FLOCK_EXCLUSIVE     2       /**< Exclusive lock. Only one process
                                           may hold an exclusive lock at any
                                           given time. This is analogous to
                                           a "write lock". */

#define APR_FLOCK_TYPEMASK      0x000F  /**< mask to extract lock type */
#define APR_FLOCK_NONBLOCK      0x0010  /**< do not block while acquiring the
                                           file lock */
/** @} */

/**
 * Open the specified file.
 * @param newf The opened file descriptor.
 * @param fname The full path to the file (using / on all systems)
 * @param flag Or'ed value of:
 * @li #APR_FOPEN_READ           open for reading
 * @li #APR_FOPEN_WRITE          open for writing
 * @li #APR_FOPEN_CREATE         create the file if not there
 * @li #APR_FOPEN_APPEND         file ptr is set to end prior to all writes
 * @li #APR_FOPEN_TRUNCATE       set length to zero if file exists
 * @li #APR_FOPEN_BINARY         not a text file
 * @li #APR_FOPEN_BUFFERED       buffer the data.  Default is non-buffered
 * @li #APR_FOPEN_EXCL           return error if #APR_FOPEN_CREATE and file exists
 * @li #APR_FOPEN_DELONCLOSE     delete the file after closing
 * @li #APR_FOPEN_XTHREAD        Platform dependent tag to open the file
 *                               for use across multiple threads
 * @li #APR_FOPEN_SHARELOCK      Platform dependent support for higher
 *                               level locked read/write access to support
 *                               writes across process/machines
 * @li #APR_FOPEN_NOCLEANUP      Do not register a cleanup with the pool 
 *                               passed in on the @a pool argument (see below)
 * @li #APR_FOPEN_SENDFILE_ENABLED  Open with appropriate platform semantics
 *                               for sendfile operations.  Advisory only,
 *                               apr_socket_sendfile does not check this flag
 * @li #APR_FOPEN_LARGEFILE      Platform dependent flag to enable large file
 *                               support, see WARNING below 
 * @li #APR_FOPEN_SPARSE         Platform dependent flag to enable sparse file
 *                               support, see WARNING below
 * @li #APR_FOPEN_NONBLOCK       Platform dependent flag to enable
 *                               non blocking file io
 * @param perm Access permissions for file.
 * @param pool The pool to use.
 * @remark If perm is #APR_FPROT_OS_DEFAULT and the file is being created,
 * appropriate default permissions will be used.
 * @remark By default, the returned file descriptor will not be
 * inherited by child processes created by apr_proc_create().  This
 * can be changed using apr_file_inherit_set().
 */
APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **newf, const char *fname,
                                        apr_int32_t flag, apr_fileperms_t perm,
                                        apr_pool_t *pool);

/**
 * Close the specified file.
 * @param file The file descriptor to close.
 */
APR_DECLARE(apr_status_t) apr_file_close(apr_file_t *file);

/**
 * Delete the specified file.
 * @param path The full path to the file (using / on all systems)
 * @param pool The pool to use.
 * @remark If the file is open, it won't be removed until all
 * instances are closed.
 */
APR_DECLARE(apr_status_t) apr_file_remove(const char *path, apr_pool_t *pool);

/**
 * Rename the specified file.
 * @param from_path The full path to the original file (using / on all systems)
 * @param to_path The full path to the new file (using / on all systems)
 * @param pool The pool to use.
 * @warning If a file exists at the new location, then it will be
 * overwritten.  Moving files or directories across devices may not be
 * possible.
 */
APR_DECLARE(apr_status_t) apr_file_rename(const char *from_path, 
                                          const char *to_path,
                                          apr_pool_t *pool);

/**
 * Create a hard link to the specified file.
 * @param from_path The full path to the original file (using / on all systems)
 * @param to_path The full path to the new file (using / on all systems)
 * @remark Both files must reside on the same device.
 */
APR_DECLARE(apr_status_t) apr_file_link(const char *from_path, 
                                          const char *to_path);

/**
 * Copy the specified file to another file.
 * @param from_path The full path to the original file (using / on all systems)
 * @param to_path The full path to the new file (using / on all systems)
 * @param perms Access permissions for the new file if it is created.
 *     In place of the usual or'd combination of file permissions, the
 *     value #APR_FPROT_FILE_SOURCE_PERMS may be given, in which case the source
 *     file's permissions are copied.
 * @param pool The pool to use.
 * @remark The new file does not need to exist, it will be created if required.
 * @warning If the new file already exists, its contents will be overwritten.
 */
APR_DECLARE(apr_status_t) apr_file_copy(const char *from_path, 
                                        const char *to_path,
                                        apr_fileperms_t perms,
                                        apr_pool_t *pool);

/**
 * Append the specified file to another file.
 * @param from_path The full path to the source file (use / on all systems)
 * @param to_path The full path to the destination file (use / on all systems)
 * @param perms Access permissions for the destination file if it is created.
 *     In place of the usual or'd combination of file permissions, the
 *     value #APR_FPROT_FILE_SOURCE_PERMS may be given, in which case the source
 *     file's permissions are copied.
 * @param pool The pool to use.
 * @remark The new file does not need to exist, it will be created if required.
 * @remark Note that advanced filesystem permissions such as ACLs are not
 * duplicated by this API. The target permissions (including duplicating the
 * source file permissions) are assigned only when the target file does not yet
 * exist.
 */
APR_DECLARE(apr_status_t) apr_file_append(const char *from_path, 
                                          const char *to_path,
                                          apr_fileperms_t perms,
                                          apr_pool_t *pool);

/**
 * Are we at the end of the file
 * @param fptr The apr file we are testing.
 * @remark Returns #APR_EOF if we are at the end of file, #APR_SUCCESS otherwise.
 */
APR_DECLARE(apr_status_t) apr_file_eof(apr_file_t *fptr);

/**
 * Open standard error as an apr file pointer.
 * @param thefile The apr file to use as stderr.
 * @param pool The pool to allocate the file out of.
 * 
 * @remark The only reason that the apr_file_open_std* functions exist
 * is that you may not always have a stderr/out/in on Windows.  This
 * is generally a problem with newer versions of Windows and services.
 * 
 * @remark The other problem is that the C library functions generally work
 * differently on Windows and Unix.  So, by using apr_file_open_std*
 * functions, you can get a handle to an APR struct that works with
 * the APR functions which are supposed to work identically on all
 * platforms.
 */
APR_DECLARE(apr_status_t) apr_file_open_stderr(apr_file_t **thefile,
                                               apr_pool_t *pool);

/**
 * open standard output as an apr file pointer.
 * @param thefile The apr file to use as stdout.
 * @param pool The pool to allocate the file out of.
 * 
 * @remark See remarks for apr_file_open_stderr().
 */
APR_DECLARE(apr_status_t) apr_file_open_stdout(apr_file_t **thefile,
                                               apr_pool_t *pool);

/**
 * open standard input as an apr file pointer.
 * @param thefile The apr file to use as stdin.
 * @param pool The pool to allocate the file out of.
 * 
 * @remark See remarks for apr_file_open_stderr().
 */
APR_DECLARE(apr_status_t) apr_file_open_stdin(apr_file_t **thefile,
                                              apr_pool_t *pool);

/**
 * open standard error as an apr file pointer, with flags.
 * @param thefile The apr file to use as stderr.
 * @param flags The flags to open the file with. Only the 
 *              @li #APR_FOPEN_EXCL
 *              @li #APR_FOPEN_BUFFERED
 *              @li #APR_FOPEN_XTHREAD
 *              @li #APR_FOPEN_SHARELOCK 
 *              @li #APR_FOPEN_SENDFILE_ENABLED
 *              @li #APR_FOPEN_LARGEFILE
 *
 *              flags should be used. The #APR_FOPEN_WRITE flag will
 *              be set unconditionally.
 * @param pool The pool to allocate the file out of.
 * 
 * @remark See remarks for apr_file_open_stderr().
 */
APR_DECLARE(apr_status_t) apr_file_open_flags_stderr(apr_file_t **thefile,
                                                     apr_int32_t flags,
                                                     apr_pool_t *pool);

/**
 * open standard output as an apr file pointer, with flags.
 * @param thefile The apr file to use as stdout.
 * @param flags The flags to open the file with. Only the 
 *              @li #APR_FOPEN_EXCL
 *              @li #APR_FOPEN_BUFFERED
 *              @li #APR_FOPEN_XTHREAD
 *              @li #APR_FOPEN_SHARELOCK 
 *              @li #APR_FOPEN_SENDFILE_ENABLED
 *              @li #APR_FOPEN_LARGEFILE
 *
 *              flags should be used. The #APR_FOPEN_WRITE flag will
 *              be set unconditionally.
 * @param pool The pool to allocate the file out of.
 * 
 * @remark See remarks for apr_file_open_stderr().
 */
APR_DECLARE(apr_status_t) apr_file_open_flags_stdout(apr_file_t **thefile,
                                                     apr_int32_t flags,
                                                     apr_pool_t *pool);

/**
 * open standard input as an apr file pointer, with flags.
 * @param thefile The apr file to use as stdin.
 * @param flags The flags to open the file with. Only the 
 *              @li #APR_FOPEN_EXCL
 *              @li #APR_FOPEN_BUFFERED
 *              @li #APR_FOPEN_XTHREAD
 *              @li #APR_FOPEN_SHARELOCK 
 *              @li #APR_FOPEN_SENDFILE_ENABLED
 *              @li #APR_FOPEN_LARGEFILE
 *
 *              flags should be used. The #APR_FOPEN_WRITE flag will
 *              be set unconditionally.
 * @param pool The pool to allocate the file out of.
 * 
 * @remark See remarks for apr_file_open_stderr().
 */
APR_DECLARE(apr_status_t) apr_file_open_flags_stdin(apr_file_t **thefile,
                                                     apr_int32_t flags,
                                                     apr_pool_t *pool);

/**
 * Read data from the specified file.
 * @param thefile The file descriptor to read from.
 * @param buf The buffer to store the data to.
 * @param nbytes On entry, the number of bytes to read; on exit, the number
 * of bytes read.
 *
 * @remark apr_file_read() will read up to the specified number of
 * bytes, but never more.  If there isn't enough data to fill that
 * number of bytes, all of the available data is read.  The third
 * argument is modified to reflect the number of bytes read.  If a
 * char was put back into the stream via ungetc, it will be the first
 * character returned.
 *
 * @remark It is not possible for both bytes to be read and an #APR_EOF
 * or other error to be returned.  #APR_EINTR is never returned.
 */
APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile, void *buf,
                                        apr_size_t *nbytes);

/**
 * Write data to the specified file.
 * @param thefile The file descriptor to write to.
 * @param buf The buffer which contains the data.
 * @param nbytes On entry, the number of bytes to write; on exit, the number 
 *               of bytes written.
 *
 * @remark apr_file_write() will write up to the specified number of
 * bytes, but never more.  If the OS cannot write that many bytes, it
 * will write as many as it can.  The third argument is modified to
 * reflect the * number of bytes written.
 *
 * @remark It is possible for both bytes to be written and an error to
 * be returned.  #APR_EINTR is never returned.
 */
APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf,
                                         apr_size_t *nbytes);

/**
 * Write data from iovec array to the specified file.
 * @param thefile The file descriptor to write to.
 * @param vec The array from which to get the data to write to the file.
 * @param nvec The number of elements in the struct iovec array. This must 
 *             be smaller than #APR_MAX_IOVEC_SIZE.  If it isn't, the function 
 *             will fail with #APR_EINVAL.
 * @param nbytes The number of bytes written.
 *
 * @remark It is possible for both bytes to be written and an error to
 * be returned.  #APR_EINTR is never returned.
 *
 * @remark apr_file_writev() is available even if the underlying
 * operating system doesn't provide writev().
 */
APR_DECLARE(apr_status_t) apr_file_writev(apr_file_t *thefile,
                                          const struct iovec *vec,
                                          apr_size_t nvec, apr_size_t *nbytes);

/**
 * Read data from the specified file, ensuring that the buffer is filled
 * before returning.
 * @param thefile The file descriptor to read from.
 * @param buf The buffer to store the data to.
 * @param nbytes The number of bytes to read.
 * @param bytes_read If non-NULL, this will contain the number of bytes read.
 *
 * @remark apr_file_read_full() will read up to the specified number of
 * bytes, but never more.  If there isn't enough data to fill that
 * number of bytes, then the process/thread will block until it is
 * available or EOF is reached.  If a char was put back into the
 * stream via ungetc, it will be the first character returned.
 *
 * @remark It is possible for both bytes to be read and an error to be
 * returned.  And if *bytes_read is less than nbytes, an accompanying
 * error is _always_ returned.
 *
 * @remark #APR_EINTR is never returned.
 */
APR_DECLARE(apr_status_t) apr_file_read_full(apr_file_t *thefile, void *buf,
                                             apr_size_t nbytes,
                                             apr_size_t *bytes_read);

/**
 * Write data to the specified file, ensuring that all of the data is
 * written before returning.
 * @param thefile The file descriptor to write to.
 * @param buf The buffer which contains the data.
 * @param nbytes The number of bytes to write.
 * @param bytes_written If non-NULL, set to the number of bytes written.
 * 
 * @remark apr_file_write_full() will write up to the specified number of
 * bytes, but never more.  If the OS cannot write that many bytes, the
 * process/thread will block until they can be written. Exceptional
 * error such as "out of space" or "pipe closed" will terminate with
 * an error.
 *
 * @remark It is possible for both bytes to be written and an error to
 * be returned.  And if *bytes_written is less than nbytes, an
 * accompanying error is _always_ returned.
 *
 * @remark #APR_EINTR is never returned.
 */
APR_DECLARE(apr_status_t) apr_file_write_full(apr_file_t *thefile, 
                                              const void *buf,
                                              apr_size_t nbytes, 
                                              apr_size_t *bytes_written);


/**
 * Write data from iovec array to the specified file, ensuring that all of the
 * data is written before returning.
 * @param thefile The file descriptor to write to.
 * @param vec The array from which to get the data to write to the file.
 * @param nvec The number of elements in the struct iovec array. This must 
 *             be smaller than #APR_MAX_IOVEC_SIZE.  If it isn't, the function 
 *             will fail with #APR_EINVAL.
 * @param nbytes The number of bytes written.
 *
 * @remark apr_file_writev_full() is available even if the underlying
 * operating system doesn't provide writev().
 */
APR_DECLARE(apr_status_t) apr_file_writev_full(apr_file_t *thefile,
                                               const struct iovec *vec,
                                               apr_size_t nvec,
                                               apr_size_t *nbytes);
/**
 * Write a character into the specified file.
 * @param ch The character to write.
 * @param thefile The file descriptor to write to
 */
APR_DECLARE(apr_status_t) apr_file_putc(char ch, apr_file_t *thefile);

/**
 * Read a character from the specified file.
 * @param ch The character to read into
 * @param thefile The file descriptor to read from
 */
APR_DECLARE(apr_status_t) apr_file_getc(char *ch, apr_file_t *thefile);

/**
 * Put a character back onto a specified stream.
 * @param ch The character to write.
 * @param thefile The file descriptor to write to
 */
APR_DECLARE(apr_status_t) apr_file_ungetc(char ch, apr_file_t *thefile);

/**
 * Read a line from the specified file
 * @param str The buffer to store the string in. 
 * @param len The length of the string
 * @param thefile The file descriptor to read from
 * @remark The buffer will be NUL-terminated if any characters are stored.
 *         The newline at the end of the line will not be stripped.
 */
APR_DECLARE(apr_status_t) apr_file_gets(char *str, int len, 
                                        apr_file_t *thefile);

/**
 * Write the string into the specified file.
 * @param str The string to write. 
 * @param thefile The file descriptor to write to
 */
APR_DECLARE(apr_status_t) apr_file_puts(const char *str, apr_file_t *thefile);

/**
 * Flush the file's buffer.
 * @param thefile The file descriptor to flush
 */
APR_DECLARE(apr_status_t) apr_file_flush(apr_file_t *thefile);

/**
 * Transfer all file modified data and metadata to disk.
 * @param thefile The file descriptor to sync
 */
APR_DECLARE(apr_status_t) apr_file_sync(apr_file_t *thefile);

/**
 * Transfer all file modified data to disk.
 * @param thefile The file descriptor to sync
 */
APR_DECLARE(apr_status_t) apr_file_datasync(apr_file_t *thefile);

/**
 * Duplicate the specified file descriptor.
 * @param new_file The structure to duplicate into. 
 * @param old_file The file to duplicate.
 * @param p The pool to use for the new file.
 * @remark *new_file must point to a valid apr_file_t, or point to NULL.
 */         
APR_DECLARE(apr_status_t) apr_file_dup(apr_file_t **new_file,
                                       apr_file_t *old_file,
                                       apr_pool_t *p);

/**
 * Duplicate the specified file descriptor and close the original
 * @param new_file The old file that is to be closed and reused
 * @param old_file The file to duplicate
 * @param p        The pool to use for the new file
 *
 * @remark new_file MUST point at a valid apr_file_t. It cannot be NULL.
 */
APR_DECLARE(apr_status_t) apr_file_dup2(apr_file_t *new_file,
                                        apr_file_t *old_file,
                                        apr_pool_t *p);

/**
 * Move the specified file descriptor to a new pool
 * @param new_file Pointer in which to return the new apr_file_t
 * @param old_file The file to move
 * @param p        The pool to which the descriptor is to be moved
 * @remark Unlike apr_file_dup2(), this function doesn't do an
 *         OS dup() operation on the underlying descriptor; it just
 *         moves the descriptor's apr_file_t wrapper to a new pool.
 * @remark The new pool need not be an ancestor of old_file's pool.
 * @remark After calling this function, old_file may not be used
 */
APR_DECLARE(apr_status_t) apr_file_setaside(apr_file_t **new_file,
                                            apr_file_t *old_file,
                                            apr_pool_t *p);

/**
 * Give the specified apr file handle a new buffer 
 * @param thefile  The file handle that is to be modified
 * @param buffer   The buffer
 * @param bufsize  The size of the buffer
 * @remark It is possible to add a buffer to previously unbuffered
 *         file handles, the #APR_FOPEN_BUFFERED flag will be added to
 *         the file handle's flags. Likewise, with buffer=NULL and
 *         bufsize=0 arguments it is possible to make a previously
 *         buffered file handle unbuffered.
 */
APR_DECLARE(apr_status_t) apr_file_buffer_set(apr_file_t *thefile,
                                              char * buffer,
                                              apr_size_t bufsize);

/**
 * Get the size of any buffer for the specified apr file handle 
 * @param thefile  The file handle 
 */
APR_DECLARE(apr_size_t) apr_file_buffer_size_get(apr_file_t *thefile);

/**
 * Move the read/write file offset to a specified byte within a file.
 * @param thefile The file descriptor
 * @param where How to move the pointer, one of:
 *              @li #APR_SET  --  set the offset to offset
 *              @li #APR_CUR  --  add the offset to the current position 
 *              @li #APR_END  --  add the offset to the current file size 
 * @param offset The offset to move the pointer to.
 * @remark The third argument is modified to be the offset the pointer
          was actually moved to.
 */
APR_DECLARE(apr_status_t) apr_file_seek(apr_file_t *thefile, 
                                   apr_seek_where_t where,
                                   apr_off_t *offset);

/**
 * Create an anonymous pipe.
 * @param in The newly created pipe's file for reading.
 * @param out The newly created pipe's file for writing.
 * @param pool The pool to operate on.
 * @remark By default, the returned file descriptors will be inherited
 * by child processes created using apr_proc_create().  This can be
 * changed using apr_file_inherit_unset().
 * @bug  Some platforms cannot toggle between blocking and nonblocking,
 * and when passing a pipe as a standard handle to an application which
 * does not expect it, a non-blocking stream will fluxor the client app.
 * @deprecated @see apr_file_pipe_create_pools()
 */
APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, 
                                               apr_file_t **out,
                                               apr_pool_t *pool);

/**
 * Create an anonymous pipe which portably supports async timeout options.
 * @param in The newly created pipe's file for reading.
 * @param out The newly created pipe's file for writing.
 * @param blocking one of these values defined in apr_thread_proc.h;
 *                 @li #APR_FULL_BLOCK
 *                 @li #APR_READ_BLOCK
 *                 @li #APR_WRITE_BLOCK
 *                 @li #APR_FULL_NONBLOCK
 * @param pool The pool to operate on.
 * @remark By default, the returned file descriptors will be inherited
 * by child processes created using apr_proc_create().  This can be
 * changed using apr_file_inherit_unset().
 * @remark Some platforms cannot toggle between blocking and nonblocking,
 * and when passing a pipe as a standard handle to an application which
 * does not expect it, a non-blocking stream will fluxor the client app.
 * Use this function rather than apr_file_pipe_create() to create pipes 
 * where one or both ends require non-blocking semantics.
 * @deprecated @see apr_file_pipe_create_pools()
 */
APR_DECLARE(apr_status_t) apr_file_pipe_create_ex(apr_file_t **in, 
                                                  apr_file_t **out, 
                                                  apr_int32_t blocking, 
                                                  apr_pool_t *pool);

/**
 * Create an anonymous pipe which portably supports async timeout options,
 * placing each side of the pipe in a different pool.
 * @param in The newly created pipe's file for reading.
 * @param out The newly created pipe's file for writing.
 * @param blocking one of these values defined in apr_thread_proc.h;
 *                 @li #APR_FULL_BLOCK
 *                 @li #APR_READ_BLOCK
 *                 @li #APR_WRITE_BLOCK
 *                 @li #APR_FULL_NONBLOCK
 * @param pool_in The pool for the reading pipe.
 * @param pool_out The pool for the writing pipe.
 * @remark By default, the returned file descriptors will be inherited
 * by child processes created using apr_proc_create().  This can be
 * changed using apr_file_inherit_unset().
 * @remark Some platforms cannot toggle between blocking and nonblocking,
 * and when passing a pipe as a standard handle to an application which
 * does not expect it, a non-blocking stream will fluxor the client app.
 * Use this function rather than apr_file_pipe_create() to create pipes
 * where one or both ends require non-blocking semantics.
 */
APR_DECLARE(apr_status_t) apr_file_pipe_create_pools(apr_file_t **in,
                                                     apr_file_t **out,
                                                     apr_int32_t blocking,
                                                     apr_pool_t *pool_in,
                                                     apr_pool_t *pool_out);

/**
 * Create a named pipe.
 * @param filename The filename of the named pipe
 * @param perm The permissions for the newly created pipe.
 * @param pool The pool to operate on.
 */
APR_DECLARE(apr_status_t) apr_file_namedpipe_create(const char *filename, 
                                                    apr_fileperms_t perm, 
                                                    apr_pool_t *pool);

/**
 * Get the timeout value for a pipe or manipulate the blocking state.
 * @param thepipe The pipe we are getting a timeout for.
 * @param timeout The current timeout value in microseconds. 
 */
APR_DECLARE(apr_status_t) apr_file_pipe_timeout_get(apr_file_t *thepipe, 
                                               apr_interval_time_t *timeout);

/**
 * Set the timeout value for a pipe or manipulate the blocking state.
 * @param thepipe The pipe we are setting a timeout on.
 * @param timeout The timeout value in microseconds.  Values < 0 mean wait 
 *        forever, 0 means do not wait at all.
 */
APR_DECLARE(apr_status_t) apr_file_pipe_timeout_set(apr_file_t *thepipe, 
                                                  apr_interval_time_t timeout);

/** file (un)locking functions. */

/**
 * Establish a lock on the specified, open file. The lock may be advisory
 * or mandatory, at the discretion of the platform. The lock applies to
 * the file as a whole, rather than a specific range. Locks are established
 * on a per-thread/process basis; a second lock by the same thread will not
 * block.
 * @param thefile The file to lock.
 * @param type The type of lock to establish on the file.
 */
APR_DECLARE(apr_status_t) apr_file_lock(apr_file_t *thefile, int type);

/**
 * Remove any outstanding locks on the file.
 * @param thefile The file to unlock.
 */
APR_DECLARE(apr_status_t) apr_file_unlock(apr_file_t *thefile);

/**accessor and general file_io functions. */

/**
 * return the file name of the current file.
 * @param new_path The path of the file.  
 * @param thefile The currently open file.
 */                     
APR_DECLARE(apr_status_t) apr_file_name_get(const char **new_path, 
                                            apr_file_t *thefile);
    
/**
 * Return the data associated with the current file.
 * @param data The user data associated with the file.  
 * @param key The key to use for retrieving data associated with this file.
 * @param file The currently open file.
 */                     
APR_DECLARE(apr_status_t) apr_file_data_get(void **data, const char *key, 
                                            apr_file_t *file);

/**
 * Set the data associated with the current file.
 * @param file The currently open file.
 * @param data The user data to associate with the file.  
 * @param key The key to use for associating data with the file.
 * @param cleanup The cleanup routine to use when the file is destroyed.
 */                     
APR_DECLARE(apr_status_t) apr_file_data_set(apr_file_t *file, void *data,
                                            const char *key,
                                            apr_status_t (*cleanup)(void *));

/**
 * Write a string to a file using a printf format.
 * @param fptr The file to write to.
 * @param format The format string
 * @param ... The values to substitute in the format string
 * @return The number of bytes written
 */ 
APR_DECLARE_NONSTD(int) apr_file_printf(apr_file_t *fptr, 
                                        const char *format, ...)
        __attribute__((format(printf,2,3)));

/**
 * set the specified file's permission bits.
 * @param fname The file (name) to apply the permissions to.
 * @param perms The permission bits to apply to the file.
 *
 * @warning Some platforms may not be able to apply all of the
 * available permission bits; #APR_INCOMPLETE will be returned if some
 * permissions are specified which could not be set.
 *
 * @warning Platforms which do not implement this feature will return
 * #APR_ENOTIMPL.
 */
APR_DECLARE(apr_status_t) apr_file_perms_set(const char *fname,
                                             apr_fileperms_t perms);

/**
 * Set attributes of the specified file.
 * @param fname The full path to the file (using / on all systems)
 * @param attributes Or'd combination of
 *            @li #APR_FILE_ATTR_READONLY   - make the file readonly
 *            @li #APR_FILE_ATTR_EXECUTABLE - make the file executable
 *            @li #APR_FILE_ATTR_HIDDEN     - make the file hidden
 * @param attr_mask Mask of valid bits in attributes.
 * @param pool the pool to use.
 * @remark This function should be used in preference to explicit manipulation
 *      of the file permissions, because the operations to provide these
 *      attributes are platform specific and may involve more than simply
 *      setting permission bits.
 * @warning Platforms which do not implement this feature will return
 *      #APR_ENOTIMPL.
 */
APR_DECLARE(apr_status_t) apr_file_attrs_set(const char *fname,
                                             apr_fileattrs_t attributes,
                                             apr_fileattrs_t attr_mask,
                                             apr_pool_t *pool);

/**
 * Set the mtime of the specified file.
 * @param fname The full path to the file (using / on all systems)
 * @param mtime The mtime to apply to the file.
 * @param pool The pool to use.
 * @warning Platforms which do not implement this feature will return
 *      #APR_ENOTIMPL.
 */
APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname,
                                             apr_time_t mtime,
                                             apr_pool_t *pool);

/**
 * Create a new directory on the file system.
 * @param path the path for the directory to be created. (use / on all systems)
 * @param perm Permissions for the new directory.
 * @param pool the pool to use.
 */                        
APR_DECLARE(apr_status_t) apr_dir_make(const char *path, apr_fileperms_t perm, 
                                       apr_pool_t *pool);

/** Creates a new directory on the file system, but behaves like
 * 'mkdir -p'. Creates intermediate directories as required. No error
 * will be reported if PATH already exists.
 * @param path the path for the directory to be created. (use / on all systems)
 * @param perm Permissions for the new directory.
 * @param pool the pool to use.
 */
APR_DECLARE(apr_status_t) apr_dir_make_recursive(const char *path,
                                                 apr_fileperms_t perm,
                                                 apr_pool_t *pool);

/**
 * Remove directory from the file system.
 * @param path the path for the directory to be removed. (use / on all systems)
 * @param pool the pool to use.
 * @remark Removing a directory which is in-use (e.g., the current working
 * directory, or during apr_dir_read, or with an open file) is not portable.
 */                        
APR_DECLARE(apr_status_t) apr_dir_remove(const char *path, apr_pool_t *pool);

/**
 * get the specified file's stats.
 * @param finfo Where to store the information about the file.
 * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_* values 
 * @param thefile The file to get information about.
 */ 
APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo, 
                                            apr_int32_t wanted,
                                            apr_file_t *thefile);
    

/**
 * Truncate the file's length to the specified offset
 * @param fp The file to truncate
 * @param offset The offset to truncate to.
 * @remark The read/write file offset is repositioned to offset.
 */
APR_DECLARE(apr_status_t) apr_file_trunc(apr_file_t *fp, apr_off_t offset);

/**
 * Retrieve the flags that were passed into apr_file_open()
 * when the file was opened.
 * @return apr_int32_t the flags
 */
APR_DECLARE(apr_int32_t) apr_file_flags_get(apr_file_t *f);

/**
 * Get the pool used by the file.
 */
APR_POOL_DECLARE_ACCESSOR(file);

/**
 * Set a file to be inherited by child processes.
 *
 */
APR_DECLARE_INHERIT_SET(file);

/**
 * Unset a file from being inherited by child processes.
 */
APR_DECLARE_INHERIT_UNSET(file);

/**
 * Open a temporary file
 * @param fp The apr file to use as a temporary file.
 * @param templ The template to use when creating a temp file.
 * @param flags The flags to open the file with. If this is zero,
 *              the file is opened with 
 *              #APR_FOPEN_CREATE | #APR_FOPEN_READ | #APR_FOPEN_WRITE |
 *              #APR_FOPEN_EXCL | #APR_FOPEN_DELONCLOSE
 * @param p The pool to allocate the file out of.
 * @remark   
 * This function  generates  a unique temporary file name from template.  
 * The last six characters of template must be XXXXXX and these are replaced 
 * with a string that makes the filename unique. Since it will  be  modified,
 * template must not be a string constant, but should be declared as a character
 * array.  
 *
 */
APR_DECLARE(apr_status_t) apr_file_mktemp(apr_file_t **fp, char *templ,
                                          apr_int32_t flags, apr_pool_t *p);


/**
 * Find an existing directory suitable as a temporary storage location.
 * @param temp_dir The temp directory.
 * @param p The pool to use for any necessary allocations.
 * @remark   
 * This function uses an algorithm to search for a directory that an
 * an application can use for temporary storage.
 *
 */
APR_DECLARE(apr_status_t) apr_temp_dir_get(const char **temp_dir, 
                                           apr_pool_t *p);

/**
 * Get the specified file's stats.  The file is specified by file
 * descriptor. 
 * @param finfo Where to store the information about the file, which is
 * never touched if the call fails.
 * @param fd The file descriptor of the file to stat.
 * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_
                 values 
 * @param pool the pool to use to allocate the new file. 
 *
 * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may
 *       not be filled in, and you need to check the @c finfo->valid bitmask
 *       to verify that what you're looking for is there.
 */ 
APR_DECLARE(apr_status_t) apr_stat_fd(apr_finfo_t *finfo, apr_file_t *fd,
                                   apr_int32_t wanted, apr_pool_t *pool);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_FILE_IO_H */
include/apr-1/apr_ldap_url.h000064400000007327150336140420011733 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file apr_ldap_url.h
 * @brief  APR-UTIL LDAP ldap_init() functions
 */
#ifndef APR_LDAP_URL_H
#define APR_LDAP_URL_H

/**
 * @addtogroup APR_Util_LDAP
 * @{
 */

#if defined(DOXYGEN)
#include "apr_ldap.h"
#endif

#if APR_HAS_LDAP

#include "apu.h"
#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/** Structure to access an exploded LDAP URL */
typedef struct apr_ldap_url_desc_t {
    struct  apr_ldap_url_desc_t  *lud_next;
    char    *lud_scheme;
    char    *lud_host;
    int     lud_port;
    char    *lud_dn;
    char    **lud_attrs;
    int     lud_scope;
    char    *lud_filter;
    char    **lud_exts;
    int     lud_crit_exts;
} apr_ldap_url_desc_t;

#ifndef APR_LDAP_URL_SUCCESS
#define APR_LDAP_URL_SUCCESS          0x00    /* Success */
#define APR_LDAP_URL_ERR_MEM          0x01    /* can't allocate memory space */
#define APR_LDAP_URL_ERR_PARAM        0x02    /* parameter is bad */
#define APR_LDAP_URL_ERR_BADSCHEME    0x03    /* URL doesn't begin with "ldap[si]://" */
#define APR_LDAP_URL_ERR_BADENCLOSURE 0x04    /* URL is missing trailing ">" */
#define APR_LDAP_URL_ERR_BADURL       0x05    /* URL is bad */
#define APR_LDAP_URL_ERR_BADHOST      0x06    /* host port is bad */
#define APR_LDAP_URL_ERR_BADATTRS     0x07    /* bad (or missing) attributes */
#define APR_LDAP_URL_ERR_BADSCOPE     0x08    /* scope string is invalid (or missing) */
#define APR_LDAP_URL_ERR_BADFILTER    0x09    /* bad or missing filter */
#define APR_LDAP_URL_ERR_BADEXTS      0x0a    /* bad or missing extensions */
#endif

/**
 * Is this URL an ldap url? ldap://
 * @param url The url to test
 */
APU_DECLARE(int) apr_ldap_is_ldap_url(const char *url);

/**
 * Is this URL an SSL ldap url? ldaps://
 * @param url The url to test
 */
APU_DECLARE(int) apr_ldap_is_ldaps_url(const char *url);

/**
 * Is this URL an ldap socket url? ldapi://
 * @param url The url to test
 */
APU_DECLARE(int) apr_ldap_is_ldapi_url(const char *url);

/**
 * Parse an LDAP URL.
 * @param pool The pool to use
 * @param url_in The URL to parse
 * @param ludpp The structure to return the exploded URL
 * @param result_err The result structure of the operation
 */
APU_DECLARE(int) apr_ldap_url_parse_ext(apr_pool_t *pool,
                                        const char *url_in,
                                        apr_ldap_url_desc_t **ludpp,
                                        apr_ldap_err_t **result_err);

/**
 * Parse an LDAP URL.
 * @param pool The pool to use
 * @param url_in The URL to parse
 * @param ludpp The structure to return the exploded URL
 * @param result_err The result structure of the operation
 */
APU_DECLARE(int) apr_ldap_url_parse(apr_pool_t *pool,
                                    const char *url_in,
                                    apr_ldap_url_desc_t **ludpp,
                                    apr_ldap_err_t **result_err);

#ifdef __cplusplus
}
#endif

#endif /* APR_HAS_LDAP */

/** @} */

#endif /* APR_LDAP_URL_H */
include/apr-1/apr_xlate.h000064400000014410150336140420011235 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_XLATE_H
#define APR_XLATE_H

#include "apu.h"
#include "apr_pools.h"
#include "apr_errno.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @file apr_xlate.h
 * @brief APR I18N translation library
 */

/**
 * @defgroup APR_XLATE I18N translation library
 * @ingroup APR
 * @{
 */
/** Opaque translation buffer */
typedef struct apr_xlate_t            apr_xlate_t;

/**
 * Set up for converting text from one charset to another.
 * @param convset The handle to be filled in by this function
 * @param topage The name of the target charset
 * @param frompage The name of the source charset
 * @param pool The pool to use
 * @remark
 *  Specify APR_DEFAULT_CHARSET for one of the charset
 *  names to indicate the charset of the source code at
 *  compile time.  This is useful if there are literal
 *  strings in the source code which must be translated
 *  according to the charset of the source code.
 *  APR_DEFAULT_CHARSET is not useful if the source code
 *  of the caller was not encoded in the same charset as
 *  APR at compile time.
 *
 * @remark
 *  Specify APR_LOCALE_CHARSET for one of the charset
 *  names to indicate the charset of the current locale.
 *
 * @remark
 *  Return APR_EINVAL if unable to procure a convset, or APR_ENOTIMPL
 *  if charset transcoding is not available in this instance of
 *  apr-util at all (i.e., APR_HAS_XLATE is undefined).
 */
APU_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset, 
                                         const char *topage, 
                                         const char *frompage, 
                                         apr_pool_t *pool);

/** 
 * This is to indicate the charset of the sourcecode at compile time
 * names to indicate the charset of the source code at
 * compile time.  This is useful if there are literal
 * strings in the source code which must be translated
 * according to the charset of the source code.
 */
#define APR_DEFAULT_CHARSET (const char *)0
/**
 * To indicate charset names of the current locale 
 */
#define APR_LOCALE_CHARSET (const char *)1

/**
 * Find out whether or not the specified conversion is single-byte-only.
 * @param convset The handle allocated by apr_xlate_open, specifying the 
 *                parameters of conversion
 * @param onoff Output: whether or not the conversion is single-byte-only
 * @remark
 *  Return APR_ENOTIMPL if charset transcoding is not available
 *  in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
 */
APU_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff);

/**
 * Convert a buffer of text from one codepage to another.
 * @param convset The handle allocated by apr_xlate_open, specifying 
 *                the parameters of conversion
 * @param inbuf The address of the source buffer
 * @param inbytes_left Input: the amount of input data to be translated
 *                     Output: the amount of input data not yet translated    
 * @param outbuf The address of the destination buffer
 * @param outbytes_left Input: the size of the output buffer
 *                      Output: the amount of the output buffer not yet used
 * @remark
 * Returns APR_ENOTIMPL if charset transcoding is not available
 * in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
 * Returns APR_INCOMPLETE if the input buffer ends in an incomplete
 * multi-byte character.
 *
 * To correctly terminate the output buffer for some multi-byte
 * character set encodings, a final call must be made to this function
 * after the complete input string has been converted, passing
 * the inbuf and inbytes_left parameters as NULL.  (Note that this
 * mode only works from version 1.1.0 onwards)
 */
APU_DECLARE(apr_status_t) apr_xlate_conv_buffer(apr_xlate_t *convset, 
                                                const char *inbuf, 
                                                apr_size_t *inbytes_left, 
                                                char *outbuf,
                                                apr_size_t *outbytes_left);

/* @see apr_file_io.h the comment in apr_file_io.h about this hack */
#ifdef APR_NOT_DONE_YET
/**
 * The purpose of apr_xlate_conv_char is to translate one character
 * at a time.  This needs to be written carefully so that it works
 * with double-byte character sets. 
 * @param convset The handle allocated by apr_xlate_open, specifying the
 *                parameters of conversion
 * @param inchar The character to convert
 * @param outchar The converted character
 */
APU_DECLARE(apr_status_t) apr_xlate_conv_char(apr_xlate_t *convset, 
                                              char inchar, char outchar);
#endif

/**
 * Convert a single-byte character from one charset to another.
 * @param convset The handle allocated by apr_xlate_open, specifying the 
 *                parameters of conversion
 * @param inchar The single-byte character to convert.
 * @warning This only works when converting between single-byte character sets.
 *          -1 will be returned if the conversion can't be performed.
 */
APU_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset, 
                                             unsigned char inchar);

/**
 * Close a codepage translation handle.
 * @param convset The codepage translation handle to close
 * @remark
 *  Return APR_ENOTIMPL if charset transcoding is not available
 *  in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
 */
APU_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset);

/** @} */
#ifdef __cplusplus
}
#endif

#endif  /* ! APR_XLATE_H */
include/apr-1/apr_user.h000064400000012276150336140420011106 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_USER_H
#define APR_USER_H

/**
 * @file apr_user.h
 * @brief APR User ID Services 
 */

#include "apr.h"
#include "apr_errno.h"
#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_user User and Group ID Services
 * @ingroup APR 
 * @{
 */

/**
 * Structure for determining user ownership.
 */
#ifdef WIN32
typedef PSID                      apr_uid_t;
#else
typedef uid_t                     apr_uid_t;
#endif

/**
 * Structure for determining group ownership.
 */
#ifdef WIN32
typedef PSID                      apr_gid_t;
#else
typedef gid_t                     apr_gid_t;
#endif

#if APR_HAS_USER 

/**
 * Get the userid (and groupid) of the calling process
 * @param userid   Returns the user id
 * @param groupid  Returns the user's group id
 * @param p The pool from which to allocate working space
 * @remark This function is available only if APR_HAS_USER is defined.
 */
APR_DECLARE(apr_status_t) apr_uid_current(apr_uid_t *userid,
                                          apr_gid_t *groupid,
                                          apr_pool_t *p);

/**
 * Get the user name for a specified userid
 * @param username Pointer to new string containing user name (on output)
 * @param userid The userid
 * @param p The pool from which to allocate the string
 * @remark This function is available only if APR_HAS_USER is defined.
 */
APR_DECLARE(apr_status_t) apr_uid_name_get(char **username, apr_uid_t userid,
                                           apr_pool_t *p);

/**
 * Get the userid (and groupid) for the specified username
 * @param userid   Returns the user id
 * @param groupid  Returns the user's group id
 * @param username The username to look up
 * @param p The pool from which to allocate working space
 * @remark This function is available only if APR_HAS_USER is defined.
 */
APR_DECLARE(apr_status_t) apr_uid_get(apr_uid_t *userid, apr_gid_t *groupid,
                                      const char *username, apr_pool_t *p);

/**
 * Get the home directory for the named user
 * @param dirname Pointer to new string containing directory name (on output)
 * @param username The named user
 * @param p The pool from which to allocate the string
 * @remark This function is available only if APR_HAS_USER is defined.
 */
APR_DECLARE(apr_status_t) apr_uid_homepath_get(char **dirname, 
                                               const char *username, 
                                               apr_pool_t *p);

/**
 * Compare two user identifiers for equality.
 * @param left One uid to test
 * @param right Another uid to test
 * @return APR_SUCCESS if the apr_uid_t structures identify the same user,
 * APR_EMISMATCH if not, APR_BADARG if an apr_uid_t is invalid.
 * @remark This function is available only if APR_HAS_USER is defined.
 */
#if defined(WIN32)
APR_DECLARE(apr_status_t) apr_uid_compare(apr_uid_t left, apr_uid_t right);
#else
#define apr_uid_compare(left,right) (((left) == (right)) ? APR_SUCCESS : APR_EMISMATCH)
#endif

/**
 * Get the group name for a specified groupid
 * @param groupname Pointer to new string containing group name (on output)
 * @param groupid The groupid
 * @param p The pool from which to allocate the string
 * @remark This function is available only if APR_HAS_USER is defined.
 */
APR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, 
                                             apr_gid_t groupid, apr_pool_t *p);

/**
 * Get the groupid for a specified group name
 * @param groupid Pointer to the group id (on output)
 * @param groupname The group name to look up
 * @param p The pool from which to allocate the string
 * @remark This function is available only if APR_HAS_USER is defined.
 */
APR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *groupid, 
                                      const char *groupname, apr_pool_t *p);

/**
 * Compare two group identifiers for equality.
 * @param left One gid to test
 * @param right Another gid to test
 * @return APR_SUCCESS if the apr_gid_t structures identify the same group,
 * APR_EMISMATCH if not, APR_BADARG if an apr_gid_t is invalid.
 * @remark This function is available only if APR_HAS_USER is defined.
 */
#if defined(WIN32)
APR_DECLARE(apr_status_t) apr_gid_compare(apr_gid_t left, apr_gid_t right);
#else
#define apr_gid_compare(left,right) (((left) == (right)) ? APR_SUCCESS : APR_EMISMATCH)
#endif

#endif  /* ! APR_HAS_USER */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_USER_H */
include/apr-1/apr_inherit.h000064400000004133150336140420011563 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_INHERIT_H
#define APR_INHERIT_H

/**
 * @file apr_inherit.h 
 * @brief APR File Handle Inheritance Helpers
 * @remark This internal header includes internal declaration helpers 
 * for other headers to declare apr_foo_inherit_[un]set functions.
 */

/**
 * Prototype for type-specific declarations of apr_foo_inherit_set 
 * functions.  
 * @remark Doxygen unwraps this macro (via doxygen.conf) to provide 
 * actual help for each specific occurrence of apr_foo_inherit_set.
 * @remark the linkage is specified for APR. It would be possible to expand
 *       the macros to support other linkages.
 */
#define APR_DECLARE_INHERIT_SET(type) \
    APR_DECLARE(apr_status_t) apr_##type##_inherit_set( \
                                          apr_##type##_t *the##type)

/**
 * Prototype for type-specific declarations of apr_foo_inherit_unset 
 * functions.  
 * @remark Doxygen unwraps this macro (via doxygen.conf) to provide 
 * actual help for each specific occurrence of apr_foo_inherit_unset.
 * @remark the linkage is specified for APR. It would be possible to expand
 *       the macros to support other linkages.
 */
#define APR_DECLARE_INHERIT_UNSET(type) \
    APR_DECLARE(apr_status_t) apr_##type##_inherit_unset( \
                                          apr_##type##_t *the##type)

#endif	/* ! APR_INHERIT_H */
include/apr-1/apr_thread_proc.h000064400000111470150336140420012416 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_THREAD_PROC_H
#define APR_THREAD_PROC_H

/**
 * @file apr_thread_proc.h
 * @brief APR Thread and Process Library
 */

#include "apr.h"
#include "apr_file_io.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_perms_set.h"

#if APR_HAVE_STRUCT_RLIMIT
#include <sys/time.h>
#include <sys/resource.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_thread_proc Threads and Process Functions
 * @ingroup APR 
 * @{
 */

typedef enum {
    APR_SHELLCMD,           /**< use the shell to invoke the program */
    APR_PROGRAM,            /**< invoke the program directly, no copied env */
    APR_PROGRAM_ENV,        /**< invoke the program, replicating our environment */
    APR_PROGRAM_PATH,       /**< find program on PATH, use our environment */
    APR_SHELLCMD_ENV        /**< use the shell to invoke the program,
                             *   replicating our environment
                             */
} apr_cmdtype_e;

typedef enum {
    APR_WAIT,           /**< wait for the specified process to finish */
    APR_NOWAIT          /**< do not wait -- just see if it has finished */
} apr_wait_how_e;

/* I am specifically calling out the values so that the macros below make
 * more sense.  Yes, I know I don't need to, but I am hoping this makes what
 * I am doing more clear.  If you want to add more reasons to exit, continue
 * to use bitmasks.
 */
typedef enum {
    APR_PROC_EXIT = 1,          /**< process exited normally */
    APR_PROC_SIGNAL = 2,        /**< process exited due to a signal */
    APR_PROC_SIGNAL_CORE = 4    /**< process exited and dumped a core file */
} apr_exit_why_e;

/** did we exit the process */
#define APR_PROC_CHECK_EXIT(x)        (x & APR_PROC_EXIT)
/** did we get a signal */
#define APR_PROC_CHECK_SIGNALED(x)    (x & APR_PROC_SIGNAL)
/** did we get core */
#define APR_PROC_CHECK_CORE_DUMP(x)   (x & APR_PROC_SIGNAL_CORE)

/** @see apr_procattr_io_set */
#define APR_NO_PIPE          0
/** @see apr_procattr_io_set and apr_file_pipe_create_ex */
#define APR_FULL_BLOCK       1
/** @see apr_procattr_io_set and apr_file_pipe_create_ex */
#define APR_FULL_NONBLOCK    2
/** @see apr_procattr_io_set */
#define APR_PARENT_BLOCK     3
/** @see apr_procattr_io_set */
#define APR_CHILD_BLOCK      4
/** @see apr_procattr_io_set */
#define APR_NO_FILE          8

/** @see apr_file_pipe_create_ex */
#define APR_READ_BLOCK       3
/** @see apr_file_pipe_create_ex */
#define APR_WRITE_BLOCK      4

/** @see apr_procattr_io_set 
 * @note Win32 only effective with version 1.2.12, portably introduced in 1.3.0
 */
#define APR_NO_FILE          8

/** @see apr_procattr_limit_set */
#define APR_LIMIT_CPU        0
/** @see apr_procattr_limit_set */
#define APR_LIMIT_MEM        1
/** @see apr_procattr_limit_set */
#define APR_LIMIT_NPROC      2
/** @see apr_procattr_limit_set */
#define APR_LIMIT_NOFILE     3

/**
 * @defgroup APR_OC Other Child Flags
 * @{
 */
#define APR_OC_REASON_DEATH         0     /**< child has died, caller must call
                                           * unregister still */
#define APR_OC_REASON_UNWRITABLE    1     /**< write_fd is unwritable */
#define APR_OC_REASON_RESTART       2     /**< a restart is occurring, perform
                                           * any necessary cleanup (including
                                           * sending a special signal to child)
                                           */
#define APR_OC_REASON_UNREGISTER    3     /**< unregister has been called, do
                                           * whatever is necessary (including
                                           * kill the child) */
#define APR_OC_REASON_LOST          4     /**< somehow the child exited without
                                           * us knowing ... buggy os? */
#define APR_OC_REASON_RUNNING       5     /**< a health check is occurring, 
                                           * for most maintainence functions
                                           * this is a no-op.
                                           */
/** @} */

/** The APR process type */
typedef struct apr_proc_t {
    /** The process ID */
    pid_t pid;
    /** Parent's side of pipe to child's stdin */
    apr_file_t *in;
    /** Parent's side of pipe to child's stdout */
    apr_file_t *out;
    /** Parent's side of pipe to child's stdouterr */
    apr_file_t *err;
#if APR_HAS_PROC_INVOKED || defined(DOXYGEN)
    /** Diagnositics/debugging string of the command invoked for 
     *  this process [only present if APR_HAS_PROC_INVOKED is true]
     * @remark Only enabled on Win32 by default.
     * @bug This should either always or never be present in release
     * builds - since it breaks binary compatibility.  We may enable
     * it always in APR 1.0 yet leave it undefined in most cases.
     */
    char *invoked;
#endif
#if defined(WIN32) || defined(DOXYGEN)
    /** (Win32 only) Creator's handle granting access to the process
     * @remark This handle is closed and reset to NULL in every case
     * corresponding to a waitpid() on Unix which returns the exit status.
     * Therefore Win32 correspond's to Unix's zombie reaping characteristics
     * and avoids potential handle leaks.
     */
    HANDLE hproc;
#endif
} apr_proc_t;

/**
 * The prototype for APR child errfn functions.  (See the description
 * of apr_procattr_child_errfn_set() for more information.)
 * It is passed the following parameters:
 * @param pool Pool associated with the apr_proc_t.  If your child
 *             error function needs user data, associate it with this
 *             pool.
 * @param err APR error code describing the error
 * @param description Text description of type of processing which failed
 */
typedef void (apr_child_errfn_t)(apr_pool_t *proc, apr_status_t err,
                                 const char *description);

/** Opaque Thread structure. */
typedef struct apr_thread_t           apr_thread_t;

/** Opaque Thread attributes structure. */
typedef struct apr_threadattr_t       apr_threadattr_t;

/** Opaque Process attributes structure. */
typedef struct apr_procattr_t         apr_procattr_t;

/** Opaque control variable for one-time atomic variables.  */
typedef struct apr_thread_once_t      apr_thread_once_t;

/** Opaque thread private address space. */
typedef struct apr_threadkey_t        apr_threadkey_t;

/** Opaque record of child process. */
typedef struct apr_other_child_rec_t  apr_other_child_rec_t;

/**
 * The prototype for any APR thread worker functions.
 */
typedef void *(APR_THREAD_FUNC *apr_thread_start_t)(apr_thread_t*, void*);

typedef enum {
    APR_KILL_NEVER,             /**< process is never killed (i.e., never sent
                                 * any signals), but it will be reaped if it exits
                                 * before the pool is cleaned up */
    APR_KILL_ALWAYS,            /**< process is sent SIGKILL on apr_pool_t cleanup */
    APR_KILL_AFTER_TIMEOUT,     /**< SIGTERM, wait 3 seconds, SIGKILL */
    APR_JUST_WAIT,              /**< wait forever for the process to complete */
    APR_KILL_ONLY_ONCE          /**< send SIGTERM and then wait */
} apr_kill_conditions_e;

/* LVE support */

#define LVE_APACHE_SUPPORT

APR_DECLARE(apr_status_t) apr_lve_environment_init(int lve_no_maxenter_value,
                                                   void *lve_ptr,
                                                   int (*lve_enter_flags_function_ptr)(void *, ...),
                                                   int (*lve_leave_function_ptr)(void *, ...),
                                                   char *suexec_string);

APR_DECLARE(apr_status_t) apr_lve_environment_init_group(int lve_no_maxenter_value,
                                                   void *lve_ptr,
                                                   int (*lve_enter_flags_function_ptr)(void *, ...),
                                                   int (*lve_leave_function_ptr)(void *, ...),
                                                   char *suexec_string,
                                                   int use_group);
                                                   
APR_DECLARE(apr_status_t) apr_lve_environment_init_group_minuid(int lve_no_maxenter_value,
                                                    void *lve_ptr,
                                                    int (*lve_enter_flags_function_ptr)(void *, ...),
                                                    int (*lve_leave_function_ptr)(void *, ...),
                                                    char *suexec_string,
                                                    int use_group,
                                                    int min_uid);

/* Thread Function definitions */

#if APR_HAS_THREADS

/**
 * Create and initialize a new threadattr variable
 * @param new_attr The newly created threadattr.
 * @param cont The pool to use
 */
APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new_attr, 
                                                apr_pool_t *cont);

/**
 * Set if newly created threads should be created in detached state.
 * @param attr The threadattr to affect 
 * @param on Non-zero if detached threads should be created.
 */
APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, 
                                                    apr_int32_t on);

/**
 * Get the detach state for this threadattr.
 * @param attr The threadattr to reference
 * @return APR_DETACH if threads are to be detached, or APR_NOTDETACH
 * if threads are to be joinable. 
 */
APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr);

/**
 * Set the stack size of newly created threads.
 * @param attr The threadattr to affect 
 * @param stacksize The stack size in bytes
 */
APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr,
                                                       apr_size_t stacksize);

/**
 * Set the stack guard area size of newly created threads.
 * @param attr The threadattr to affect 
 * @param guardsize The stack guard area size in bytes
 * @note Thread library implementations commonly use a "guard area"
 * after each thread's stack which is not readable or writable such that
 * stack overflows cause a segfault; this consumes e.g. 4K of memory
 * and increases memory management overhead.  Setting the guard area
 * size to zero hence trades off reliable behaviour on stack overflow
 * for performance. */
APR_DECLARE(apr_status_t) apr_threadattr_guardsize_set(apr_threadattr_t *attr,
                                                       apr_size_t guardsize);

/**
 * Create a new thread of execution
 * @param new_thread The newly created thread handle.
 * @param attr The threadattr to use to determine how to create the thread
 * @param func The function to start the new thread in
 * @param data Any data to be passed to the starting function
 * @param cont The pool to use
 */
APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new_thread, 
                                            apr_threadattr_t *attr, 
                                            apr_thread_start_t func, 
                                            void *data, apr_pool_t *cont);

/**
 * stop the current thread
 * @param thd The thread to stop
 * @param retval The return value to pass back to any thread that cares
 */
APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, 
                                          apr_status_t retval);

/**
 * block until the desired thread stops executing.
 * @param retval The return value from the dead thread.
 * @param thd The thread to join
 */
APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, 
                                          apr_thread_t *thd); 

/**
 * force the current thread to yield the processor
 */
APR_DECLARE(void) apr_thread_yield(void);

/**
 * Initialize the control variable for apr_thread_once.  If this isn't
 * called, apr_initialize won't work.
 * @param control The control variable to initialize
 * @param p The pool to allocate data from.
 */
APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control,
                                               apr_pool_t *p);

/**
 * Run the specified function one time, regardless of how many threads
 * call it.
 * @param control The control variable.  The same variable should
 *                be passed in each time the function is tried to be
 *                called.  This is how the underlying functions determine
 *                if the function has ever been called before.
 * @param func The function to call.
 */
APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control,
                                          void (*func)(void));

/**
 * detach a thread
 * @param thd The thread to detach 
 */
APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd);

/**
 * Return user data associated with the current thread.
 * @param data The user data associated with the thread.
 * @param key The key to associate with the data
 * @param thread The currently open thread.
 */
APR_DECLARE(apr_status_t) apr_thread_data_get(void **data, const char *key,
                                             apr_thread_t *thread);

/**
 * Set user data associated with the current thread.
 * @param data The user data to associate with the thread.
 * @param key The key to use for associating the data with the thread
 * @param cleanup The cleanup routine to use when the thread is destroyed.
 * @param thread The currently open thread.
 */
APR_DECLARE(apr_status_t) apr_thread_data_set(void *data, const char *key,
                                             apr_status_t (*cleanup) (void *),
                                             apr_thread_t *thread);

/**
 * Create and initialize a new thread private address space
 * @param key The thread private handle.
 * @param dest The destructor to use when freeing the private memory.
 * @param cont The pool to use
 */
APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key, 
                                                    void (*dest)(void *),
                                                    apr_pool_t *cont);

/**
 * Get a pointer to the thread private memory
 * @param new_mem The data stored in private memory 
 * @param key The handle for the desired thread private memory 
 */
APR_DECLARE(apr_status_t) apr_threadkey_private_get(void **new_mem, 
                                                 apr_threadkey_t *key);

/**
 * Set the data to be stored in thread private memory
 * @param priv The data to be stored in private memory 
 * @param key The handle for the desired thread private memory 
 */
APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, 
                                                 apr_threadkey_t *key);

/**
 * Free the thread private memory
 * @param key The handle for the desired thread private memory 
 */
APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key);

/**
 * Return the pool associated with the current threadkey.
 * @param data The user data associated with the threadkey.
 * @param key The key associated with the data
 * @param threadkey The currently open threadkey.
 */
APR_DECLARE(apr_status_t) apr_threadkey_data_get(void **data, const char *key,
                                                apr_threadkey_t *threadkey);

/**
 * Return the pool associated with the current threadkey.
 * @param data The data to set.
 * @param key The key to associate with the data.
 * @param cleanup The cleanup routine to use when the file is destroyed.
 * @param threadkey The currently open threadkey.
 */
APR_DECLARE(apr_status_t) apr_threadkey_data_set(void *data, const char *key,
                                                apr_status_t (*cleanup) (void *),
                                                apr_threadkey_t *threadkey);

#endif

/**
 * Create and initialize a new procattr variable
 * @param new_attr The newly created procattr. 
 * @param cont The pool to use
 */
APR_DECLARE(apr_status_t) apr_procattr_create(apr_procattr_t **new_attr,
                                                  apr_pool_t *cont);

/**
 * Determine if any of stdin, stdout, or stderr should be linked to pipes 
 * when starting a child process.
 * @param attr The procattr we care about. 
 * @param in Should stdin be a pipe back to the parent?
 * @param out Should stdout be a pipe back to the parent?
 * @param err Should stderr be a pipe back to the parent?
 * @note If APR_NO_PIPE, there will be no special channel, the child
 * inherits the parent's corresponding stdio stream.  If APR_NO_FILE is 
 * specified, that corresponding stream is closed in the child (and will
 * be INVALID_HANDLE_VALUE when inspected on Win32). This can have ugly 
 * side effects, as the next file opened in the child on Unix will fall
 * into the stdio stream fd slot!
 */
APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, 
                                             apr_int32_t in, apr_int32_t out,
                                             apr_int32_t err);

/**
 * Set the child_in and/or parent_in values to existing apr_file_t values.
 * @param attr The procattr we care about. 
 * @param child_in apr_file_t value to use as child_in. Must be a valid file.
 * @param parent_in apr_file_t value to use as parent_in. Must be a valid file.
 * @remark  This is NOT a required initializer function. This is
 *          useful if you have already opened a pipe (or multiple files)
 *          that you wish to use, perhaps persistently across multiple
 *          process invocations - such as a log file. You can save some 
 *          extra function calls by not creating your own pipe since this
 *          creates one in the process space for you.
 * @bug Note that calling this function with two NULL files on some platforms
 * creates an APR_FULL_BLOCK pipe, but this behavior is neither portable nor
 * is it supported.  @see apr_procattr_io_set instead for simple pipes.
 */
APR_DECLARE(apr_status_t) apr_procattr_child_in_set(struct apr_procattr_t *attr,
                                                  apr_file_t *child_in,
                                                  apr_file_t *parent_in);

/**
 * Set the child_out and parent_out values to existing apr_file_t values.
 * @param attr The procattr we care about. 
 * @param child_out apr_file_t value to use as child_out. Must be a valid file.
 * @param parent_out apr_file_t value to use as parent_out. Must be a valid file.
 * @remark This is NOT a required initializer function. This is
 *         useful if you have already opened a pipe (or multiple files)
 *         that you wish to use, perhaps persistently across multiple
 *         process invocations - such as a log file. 
 * @bug Note that calling this function with two NULL files on some platforms
 * creates an APR_FULL_BLOCK pipe, but this behavior is neither portable nor
 * is it supported.  @see apr_procattr_io_set instead for simple pipes.
 */
APR_DECLARE(apr_status_t) apr_procattr_child_out_set(struct apr_procattr_t *attr,
                                                   apr_file_t *child_out,
                                                   apr_file_t *parent_out);

/**
 * Set the child_err and parent_err values to existing apr_file_t values.
 * @param attr The procattr we care about. 
 * @param child_err apr_file_t value to use as child_err. Must be a valid file.
 * @param parent_err apr_file_t value to use as parent_err. Must be a valid file.
 * @remark This is NOT a required initializer function. This is
 *         useful if you have already opened a pipe (or multiple files)
 *         that you wish to use, perhaps persistently across multiple
 *         process invocations - such as a log file. 
 * @bug Note that calling this function with two NULL files on some platforms
 * creates an APR_FULL_BLOCK pipe, but this behavior is neither portable nor
 * is it supported.  @see apr_procattr_io_set instead for simple pipes.
 */
APR_DECLARE(apr_status_t) apr_procattr_child_err_set(struct apr_procattr_t *attr,
                                                   apr_file_t *child_err,
                                                   apr_file_t *parent_err);

/**
 * Set which directory the child process should start executing in.
 * @param attr The procattr we care about. 
 * @param dir Which dir to start in.  By default, this is the same dir as
 *            the parent currently resides in, when the createprocess call
 *            is made. 
 */
APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, 
                                              const char *dir);

/**
 * Set what type of command the child process will call.
 * @param attr The procattr we care about. 
 * @param cmd The type of command.  One of:
 * <PRE>
 *            APR_SHELLCMD     --  Anything that the shell can handle
 *            APR_PROGRAM      --  Executable program   (default) 
 *            APR_PROGRAM_ENV  --  Executable program, copy environment
 *            APR_PROGRAM_PATH --  Executable program on PATH, copy env
 * </PRE>
 */
APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr,
                                                  apr_cmdtype_e cmd);

/**
 * Determine if the child should start in detached state.
 * @param attr The procattr we care about. 
 * @param detach Should the child start in detached state?  Default is no. 
 */
APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, 
                                                 apr_int32_t detach);

#if APR_HAVE_STRUCT_RLIMIT
/**
 * Set the Resource Utilization limits when starting a new process.
 * @param attr The procattr we care about. 
 * @param what Which limit to set, one of:
 * <PRE>
 *                 APR_LIMIT_CPU
 *                 APR_LIMIT_MEM
 *                 APR_LIMIT_NPROC
 *                 APR_LIMIT_NOFILE
 * </PRE>
 * @param limit Value to set the limit to.
 */
APR_DECLARE(apr_status_t) apr_procattr_limit_set(apr_procattr_t *attr, 
                                                apr_int32_t what,
                                                struct rlimit *limit);
#endif

/**
 * Specify an error function to be called in the child process if APR
 * encounters an error in the child prior to running the specified program.
 * @param attr The procattr describing the child process to be created.
 * @param errfn The function to call in the child process.
 * @remark At the present time, it will only be called from apr_proc_create()
 *         on platforms where fork() is used.  It will never be called on other
 *         platforms, on those platforms apr_proc_create() will return the error
 *         in the parent process rather than invoke the callback in the now-forked
 *         child process.
 */
APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr,
                                                       apr_child_errfn_t *errfn);

/**
 * Specify that apr_proc_create() should do whatever it can to report
 * failures to the caller of apr_proc_create(), rather than find out in
 * the child.
 * @param attr The procattr describing the child process to be created.
 * @param chk Flag to indicate whether or not extra work should be done
 *            to try to report failures to the caller.
 * @remark This flag only affects apr_proc_create() on platforms where
 *         fork() is used.  This leads to extra overhead in the calling
 *         process, but that may help the application handle such
 *         errors more gracefully.
 */
APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr,
                                                       apr_int32_t chk);

/**
 * Determine if the child should start in its own address space or using the 
 * current one from its parent
 * @param attr The procattr we care about. 
 * @param addrspace Should the child start in its own address space?  Default
 *                  is no on NetWare and yes on other platforms.
 */
APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr,
                                                       apr_int32_t addrspace);

/**
 * Set the username used for running process
 * @param attr The procattr we care about. 
 * @param username The username used
 * @param password User password if needed. Password is needed on WIN32
 *                 or any other platform having
 *                 APR_PROCATTR_USER_SET_REQUIRES_PASSWORD set.
 */
APR_DECLARE(apr_status_t) apr_procattr_user_set(apr_procattr_t *attr,
                                                const char *username,
                                                const char *password);

/**
 * Set the group used for running process
 * @param attr The procattr we care about. 
 * @param groupname The group name  used
 */
APR_DECLARE(apr_status_t) apr_procattr_group_set(apr_procattr_t *attr,
                                                 const char *groupname);


/**
 * Register permission set function
 * @param attr The procattr we care about. 
 * @param perms_set_fn Permission set callback
 * @param data Data to pass to permission callback function
 * @param perms Permissions to set
 */
APR_DECLARE(apr_status_t) apr_procattr_perms_set_register(apr_procattr_t *attr,
                                                 apr_perms_setfn_t *perms_set_fn,
                                                 void *data,
                                                 apr_fileperms_t perms);

#if APR_HAS_FORK
/**
 * This is currently the only non-portable call in APR.  This executes 
 * a standard unix fork.
 * @param proc The resulting process handle. 
 * @param cont The pool to use. 
 * @remark returns APR_INCHILD for the child, and APR_INPARENT for the parent
 * or an error.
 */
APR_DECLARE(apr_status_t) apr_proc_fork(apr_proc_t *proc, apr_pool_t *cont);
#endif

/**
 * Create a new process and execute a new program within that process.
 * @param new_proc The resulting process handle.
 * @param progname The program to run 
 * @param args the arguments to pass to the new program.  The first 
 *             one should be the program name.
 * @param env The new environment table for the new process.  This 
 *            should be a list of NULL-terminated strings. This argument
 *            is ignored for APR_PROGRAM_ENV, APR_PROGRAM_PATH, and
 *            APR_SHELLCMD_ENV types of commands.
 * @param attr the procattr we should use to determine how to create the new
 *         process
 * @param pool The pool to use.
 * @note This function returns without waiting for the new process to terminate;
 * use apr_proc_wait for that.
 */
APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new_proc,
                                          const char *progname,
                                          const char * const *args,
                                          const char * const *env, 
                                          apr_procattr_t *attr, 
                                          apr_pool_t *pool);

/**
 * Wait for a child process to die
 * @param proc The process handle that corresponds to the desired child process 
 * @param exitcode The returned exit status of the child, if a child process 
 *                 dies, or the signal that caused the child to die.
 *                 On platforms that don't support obtaining this information, 
 *                 the status parameter will be returned as APR_ENOTIMPL.
 * @param exitwhy Why the child died, the bitwise or of:
 * <PRE>
 *            APR_PROC_EXIT         -- process terminated normally
 *            APR_PROC_SIGNAL       -- process was killed by a signal
 *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
 *                                     generated a core dump.
 * </PRE>
 * @param waithow How should we wait.  One of:
 * <PRE>
 *            APR_WAIT   -- block until the child process dies.
 *            APR_NOWAIT -- return immediately regardless of if the 
 *                          child is dead or not.
 * </PRE>
 * @remark The child's status is in the return code to this process.  It is one of:
 * <PRE>
 *            APR_CHILD_DONE     -- child is no longer running.
 *            APR_CHILD_NOTDONE  -- child is still running.
 * </PRE>
 */
APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
                                        int *exitcode, apr_exit_why_e *exitwhy,
                                        apr_wait_how_e waithow);

/**
 * Wait for any current child process to die and return information 
 * about that child.
 * @param proc Pointer to NULL on entry, will be filled out with child's 
 *             information 
 * @param exitcode The returned exit status of the child, if a child process 
 *                 dies, or the signal that caused the child to die.
 *                 On platforms that don't support obtaining this information, 
 *                 the status parameter will be returned as APR_ENOTIMPL.
 * @param exitwhy Why the child died, the bitwise or of:
 * <PRE>
 *            APR_PROC_EXIT         -- process terminated normally
 *            APR_PROC_SIGNAL       -- process was killed by a signal
 *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
 *                                     generated a core dump.
 * </PRE>
 * @param waithow How should we wait.  One of:
 * <PRE>
 *            APR_WAIT   -- block until the child process dies.
 *            APR_NOWAIT -- return immediately regardless of if the 
 *                          child is dead or not.
 * </PRE>
 * @param p Pool to allocate child information out of.
 * @bug Passing proc as a *proc rather than **proc was an odd choice
 * for some platforms... this should be revisited in 1.0
 */
APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
                                                  int *exitcode,
                                                  apr_exit_why_e *exitwhy,
                                                  apr_wait_how_e waithow,
                                                  apr_pool_t *p);

#define APR_PROC_DETACH_FOREGROUND 0    /**< Do not detach */
#define APR_PROC_DETACH_DAEMONIZE 1     /**< Detach */

/**
 * Detach the process from the controlling terminal.
 * @param daemonize set to non-zero if the process should daemonize
 *                  and become a background process, else it will
 *                  stay in the foreground.
 */
APR_DECLARE(apr_status_t) apr_proc_detach(int daemonize);

/**
 * Register an other_child -- a child associated to its registered 
 * maintence callback.  This callback is invoked when the process
 * dies, is disconnected or disappears.
 * @param proc The child process to register.
 * @param maintenance maintenance is a function that is invoked with a 
 *                    reason and the data pointer passed here.
 * @param data Opaque context data passed to the maintenance function.
 * @param write_fd An fd that is probed for writing.  If it is ever unwritable
 *                 then the maintenance is invoked with reason 
 *                 OC_REASON_UNWRITABLE.
 * @param p The pool to use for allocating memory.
 * @bug write_fd duplicates the proc->out stream, it's really redundant
 * and should be replaced in the APR 1.0 API with a bitflag of which
 * proc->in/out/err handles should be health checked.
 * @bug no platform currently tests the pipes health.
 */
APR_DECLARE(void) apr_proc_other_child_register(apr_proc_t *proc, 
                                           void (*maintenance) (int reason, 
                                                                void *, 
                                                                int status),
                                           void *data, apr_file_t *write_fd,
                                           apr_pool_t *p);

/**
 * Stop watching the specified other child.  
 * @param data The data to pass to the maintenance function.  This is
 *             used to find the process to unregister.
 * @warning Since this can be called by a maintenance function while we're
 *          scanning the other_children list, all scanners should protect 
 *          themself by loading ocr->next before calling any maintenance 
 *          function.
 */
APR_DECLARE(void) apr_proc_other_child_unregister(void *data);

/**
 * Notify the maintenance callback of a registered other child process
 * that application has detected an event, such as death.
 * @param proc The process to check
 * @param reason The reason code to pass to the maintenance function
 * @param status The status to pass to the maintenance function
 * @remark An example of code using this behavior;
 * <pre>
 * rv = apr_proc_wait_all_procs(&proc, &exitcode, &status, APR_WAIT, p);
 * if (APR_STATUS_IS_CHILD_DONE(rv)) {
 * \#if APR_HAS_OTHER_CHILD
 *     if (apr_proc_other_child_alert(&proc, APR_OC_REASON_DEATH, status)
 *             == APR_SUCCESS) {
 *         ;  (already handled)
 *     }
 *     else
 * \#endif
 *         [... handling non-otherchild processes death ...]
 * </pre>
 */
APR_DECLARE(apr_status_t) apr_proc_other_child_alert(apr_proc_t *proc, 
                                                     int reason,
                                                     int status);

/**
 * Test one specific other child processes and invoke the maintenance callback 
 * with the appropriate reason code, if still running, or the appropriate reason 
 * code if the process is no longer healthy.
 * @param ocr The registered other child
 * @param reason The reason code (e.g. APR_OC_REASON_RESTART) if still running
 */
APR_DECLARE(void) apr_proc_other_child_refresh(apr_other_child_rec_t *ocr,
                                               int reason);

/**
 * Test all registered other child processes and invoke the maintenance callback 
 * with the appropriate reason code, if still running, or the appropriate reason 
 * code if the process is no longer healthy.
 * @param reason The reason code (e.g. APR_OC_REASON_RESTART) to running processes
 */
APR_DECLARE(void) apr_proc_other_child_refresh_all(int reason);

/** 
 * Terminate a process.
 * @param proc The process to terminate.
 * @param sig How to kill the process.
 */
APR_DECLARE(apr_status_t) apr_proc_kill(apr_proc_t *proc, int sig);

/**
 * Register a process to be killed when a pool dies.
 * @param a The pool to use to define the processes lifetime 
 * @param proc The process to register
 * @param how How to kill the process, one of:
 * <PRE>
 *         APR_KILL_NEVER         -- process is never sent any signals
 *         APR_KILL_ALWAYS        -- process is sent SIGKILL on apr_pool_t cleanup
 *         APR_KILL_AFTER_TIMEOUT -- SIGTERM, wait 3 seconds, SIGKILL
 *         APR_JUST_WAIT          -- wait forever for the process to complete
 *         APR_KILL_ONLY_ONCE     -- send SIGTERM and then wait
 * </PRE>
 */
APR_DECLARE(void) apr_pool_note_subprocess(apr_pool_t *a, apr_proc_t *proc,
                                           apr_kill_conditions_e how);

#if APR_HAS_THREADS 

#if (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2)

/**
 * Setup the process for a single thread to be used for all signal handling.
 * @warning This must be called before any threads are created
 */
APR_DECLARE(apr_status_t) apr_setup_signal_thread(void);

/**
 * Make the current thread listen for signals.  This thread will loop
 * forever, calling a provided function whenever it receives a signal.  That
 * functions should return 1 if the signal has been handled, 0 otherwise.
 * @param signal_handler The function to call when a signal is received
 * apr_status_t apr_signal_thread((int)(*signal_handler)(int signum))
 * @note Synchronous signals like SIGABRT/SIGSEGV/SIGBUS/... are ignored by
 * apr_signal_thread() and thus can't be waited by this function (they remain
 * handled by the operating system or its native signals interface).
 * @remark In APR version 1.6 and ealier, SIGUSR2 was part of these ignored
 * signals and thus was never passed in to the signal_handler. From APR 1.7
 * this is no more the case so SIGUSR2 can be handled in signal_handler and
 * acted upon like the other asynchronous signals.
 */
APR_DECLARE(apr_status_t) apr_signal_thread(int(*signal_handler)(int signum));

#endif /* (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) */

/**
 * Get the child-pool used by the thread from the thread info.
 * @return apr_pool_t the pool
 */
APR_POOL_DECLARE_ACCESSOR(thread);

#endif /* APR_HAS_THREADS */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_THREAD_PROC_H */

include/apr-1/apr_ldap_rebind.h000064400000006140150336140420012364 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * The APR LDAP rebind functions provide an implementation of
 * a rebind procedure that can be used to allow clients to chase referrals,
 * using the same credentials used to log in originally.
 *
 * Use of this implementation is optional.
 *
 * @file apr_ldap_rebind.h
 * @brief Apache LDAP library
 */

#ifndef APU_LDAP_REBIND_H
#define APU_LDAP_REBIND_H

/**
 * @addtogroup APR_Util_LDAP
 * @{
 **/

#if defined(DOXYGEN)
#include "apr_ldap.h"
#endif

/*
 * Handle the case when LDAP is enabled
 */
#if APR_HAS_LDAP

/**
 * APR LDAP initialize rebind lock
 *
 * This function creates the lock for controlling access to the xref list..
 * @param pool Pool to use when creating the xref_lock.
 */
APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool);


/**
 * APR LDAP rebind_add function
 *
 * This function creates a cross reference entry for the specified ldap
 * connection. The rebind callback function will look up this ldap 
 * connection so it can retrieve the bindDN and bindPW for use in any 
 * binds while referrals are being chased.
 *
 * This function will add the callback to the LDAP handle passed in.
 *
 * A cleanup is registered within the pool provided to remove this
 * entry when the pool is removed. Alternatively apr_ldap_rebind_remove()
 * can be called to explicitly remove the entry at will.
 *
 * @param pool The pool to use
 * @param ld The LDAP connectionhandle
 * @param bindDN The bind DN to be used for any binds while chasing 
 *               referrals on this ldap connection.
 * @param bindPW The bind Password to be used for any binds while 
 *               chasing referrals on this ldap connection.
 */
APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
                                                   LDAP *ld,
                                                   const char *bindDN,
                                                   const char *bindPW);

/**
 * APR LDAP rebind_remove function
 *
 * This function removes the rebind cross reference entry for the
 * specified ldap connection.
 *
 * If not explicitly removed, this function will be called automatically
 * when the pool is cleaned up.
 *
 * @param ld The LDAP connectionhandle
 */
APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld);

#endif /* APR_HAS_LDAP */

/** @} */

#endif /* APU_LDAP_REBIND_H */

include/apr-1/apr_fnmatch.h000064400000014125150336140420011543 0ustar00/*
 * Copyright (c) 1992, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)fnmatch.h	8.1 (Berkeley) 6/2/93
 */

/* This file has been modified by the Apache Software Foundation. */
#ifndef	_APR_FNMATCH_H_
#define	_APR_FNMATCH_H_

/**
 * @file apr_fnmatch.h
 * @brief APR FNMatch Functions
 */

#include "apr_errno.h"
#include "apr_tables.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup apr_fnmatch Filename Matching Functions
 * @ingroup APR 
 * @{
 */

#define APR_FNM_NOMATCH     1     /**< Match failed. */
 
#define APR_FNM_NOESCAPE    0x01  /**< Disable backslash escaping. */
#define APR_FNM_PATHNAME    0x02  /**< Slash must be matched by slash. */
#define APR_FNM_PERIOD      0x04  /**< Period must be matched by period. */
#define APR_FNM_CASE_BLIND  0x08  /**< Compare characters case-insensitively. */

/**
 * Try to match the string to the given pattern, return APR_SUCCESS if
 *    match, else return APR_FNM_NOMATCH.  Note that there is no such thing as
 *    an illegal pattern.
 *
 * With all flags unset, a pattern is interpreted as such:
 *
 * PATTERN: Backslash followed by any character, including another
 *          backslash.<br/>
 * MATCHES: That character exactly.
 * 
 * <p>
 * PATTERN: ?<br/>
 * MATCHES: Any single character.
 * </p>
 * 
 * <p>
 * PATTERN: *<br/>
 * MATCHES: Any sequence of zero or more characters. (Note that multiple
 *          *s in a row are equivalent to one.)
 * 
 * PATTERN: Any character other than \?*[ or a \ at the end of the pattern<br/>
 * MATCHES: That character exactly. (Case sensitive.)
 * 
 * PATTERN: [ followed by a class description followed by ]<br/>
 * MATCHES: A single character described by the class description.
 *          (Never matches, if the class description reaches until the
 *          end of the string without a ].) If the first character of
 *          the class description is ^ or !, the sense of the description
 *          is reversed.  The rest of the class description is a list of
 *          single characters or pairs of characters separated by -. Any
 *          of those characters can have a backslash in front of them,
 *          which is ignored; this lets you use the characters ] and -
 *          in the character class, as well as ^ and ! at the
 *          beginning.  The pattern matches a single character if it
 *          is one of the listed characters or falls into one of the
 *          listed ranges (inclusive, case sensitive).  Ranges with
 *          the first character larger than the second are legal but
 *          never match. Edge cases: [] never matches, and [^] and [!]
 *          always match without consuming a character.
 * 
 * Note that these patterns attempt to match the entire string, not
 * just find a substring matching the pattern.
 *
 * @param pattern The pattern to match to
 * @param strings The string we are trying to match
 * @param flags flags to use in the match.  Bitwise OR of:
 * <pre>
 *              APR_FNM_NOESCAPE       Disable backslash escaping
 *              APR_FNM_PATHNAME       Slash must be matched by slash
 *              APR_FNM_PERIOD         Period must be matched by period
 *              APR_FNM_CASE_BLIND     Compare characters case-insensitively.
 * </pre>
 */

APR_DECLARE(apr_status_t) apr_fnmatch(const char *pattern, 
                                      const char *strings, int flags);

/**
 * Determine if the given pattern is a regular expression.
 * @param pattern The pattern to search for glob characters.
 * @return non-zero if pattern has any glob characters in it
 */
APR_DECLARE(int) apr_fnmatch_test(const char *pattern);

/**
 * Find all files that match a specified pattern in a directory.
 * @param dir_pattern The pattern to use for finding files, appended
 * to the search directory.  The pattern is anything following the
 * final forward or backward slash in the parameter.  If no slash
 * is found, the current directory is searched.
 * @param result Array to use when storing the results
 * @param p The pool to use.
 * @return APR_SUCCESS if no processing errors occurred, APR error
 * code otherwise
 * @remark The returned array may be empty even if APR_SUCCESS was
 * returned.
 */
APR_DECLARE(apr_status_t) apr_match_glob(const char *dir_pattern, 
                                         apr_array_header_t **result,
                                         apr_pool_t *p);

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* !_APR_FNMATCH_H_ */
include/apr-1/apr_crypto.h000064400000047275150336140420011457 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_CRYPTO_H
#define APR_CRYPTO_H

#include "apu.h"
#include "apr_pools.h"
#include "apr_tables.h"
#include "apr_hash.h"
#include "apu_errno.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @file apr_crypto.h
 * @brief APR-UTIL Crypto library
 */
/**
 * @defgroup APR_Util_Crypto Crypto routines
 * @ingroup APR_Util
 * @{
 */

#if APU_HAVE_CRYPTO

#ifndef APU_CRYPTO_RECOMMENDED_DRIVER
#if APU_HAVE_COMMONCRYPTO
#define APU_CRYPTO_RECOMMENDED_DRIVER "commoncrypto"
#else
#if APU_HAVE_OPENSSL
#define APU_CRYPTO_RECOMMENDED_DRIVER "openssl"
#else
#if APU_HAVE_NSS
#define APU_CRYPTO_RECOMMENDED_DRIVER "nss"
#else
#if APU_HAVE_MSCNG
#define APU_CRYPTO_RECOMMENDED_DRIVER "mscng"
#else
#if APU_HAVE_MSCAPI
#define APU_CRYPTO_RECOMMENDED_DRIVER "mscapi"
#else
#endif
#endif
#endif
#endif
#endif
#endif

/**
 * Symmetric Key types understood by the library.
 *
 * NOTE: It is expected that this list will grow over time.
 *
 * Interoperability Matrix:
 *
 * The matrix is based on the testcrypto.c unit test, which attempts to
 * test whether a simple encrypt/decrypt will succeed, as well as testing
 * whether an encrypted string by one library can be decrypted by the
 * others.
 *
 * Some libraries will successfully encrypt and decrypt their own data,
 * but won't decrypt data from another library. It is hoped that over
 * time these anomalies will be found and fixed, but until then it is
 * recommended that ciphers are chosen that interoperate across platform.
 *
 * An X below means the test passes, it does not necessarily mean that
 * encryption performed is correct or secure. Applications should stick
 * to ciphers that pass the interoperablity tests on the right hand side
 * of the table.
 *
 * Aligned data is data whose length is a multiple of the block size for
 * the chosen cipher. Padded data is data that is not aligned by block
 * size and must be padded by the crypto library.
 *
 *                  OpenSSL    CommonCrypto   NSS       Interop
 *                 Align  Pad  Align  Pad  Align  Pad  Align  Pad
 * 3DES_192/CBC    X      X    X      X    X      X    X      X
 * 3DES_192/ECB    X      X    X      X
 * AES_256/CBC     X      X    X      X    X      X    X      X
 * AES_256/ECB     X      X    X      X    X           X
 * AES_192/CBC     X      X    X      X    X      X
 * AES_192/ECB     X      X    X      X    X
 * AES_128/CBC     X      X    X      X    X      X
 * AES_128/ECB     X      X    X      X    X
 *
 * Conclusion: for padded data, use 3DES_192/CBC or AES_256/CBC. For
 * aligned data, use 3DES_192/CBC, AES_256/CBC or AES_256/ECB.
 */

typedef enum
{
    APR_KEY_NONE, APR_KEY_3DES_192, /** 192 bit (3-Key) 3DES */
    APR_KEY_AES_128, /** 128 bit AES */
    APR_KEY_AES_192, /** 192 bit AES */
    APR_KEY_AES_256
/** 256 bit AES */
} apr_crypto_block_key_type_e;

typedef enum
{
    APR_MODE_NONE, /** An error condition */
    APR_MODE_ECB, /** Electronic Code Book */
    APR_MODE_CBC
/** Cipher Block Chaining */
} apr_crypto_block_key_mode_e;

/* These are opaque structs.  Instantiation is up to each backend */
typedef struct apr_crypto_driver_t apr_crypto_driver_t;
typedef struct apr_crypto_t apr_crypto_t;
typedef struct apr_crypto_config_t apr_crypto_config_t;
typedef struct apr_crypto_key_t apr_crypto_key_t;
typedef struct apr_crypto_block_t apr_crypto_block_t;

typedef struct apr_crypto_block_key_type_t {
    apr_crypto_block_key_type_e type;
    int keysize;
    int blocksize;
    int ivsize;
} apr_crypto_block_key_type_t;

typedef struct apr_crypto_block_key_mode_t {
    apr_crypto_block_key_mode_e mode;
} apr_crypto_block_key_mode_t;

typedef struct apr_crypto_passphrase_t {
    const char *pass;
    apr_size_t passLen;
    const unsigned char * salt;
    apr_size_t saltLen;
    int iterations;
} apr_crypto_passphrase_t;

typedef struct apr_crypto_secret_t {
    const unsigned char *secret;
    apr_size_t secretLen;
} apr_crypto_secret_t;

typedef enum {
    /** Key is derived from a passphrase */
    APR_CRYPTO_KTYPE_PASSPHRASE     = 1,
    /** Key is derived from a raw key */
    APR_CRYPTO_KTYPE_SECRET     = 2,
} apr_crypto_key_type;

typedef struct apr_crypto_key_rec_t {
    apr_crypto_key_type ktype;
    apr_crypto_block_key_type_e type;
    apr_crypto_block_key_mode_e mode;
    int pad;
    union {
        apr_crypto_passphrase_t passphrase;
        apr_crypto_secret_t secret;
    } k;
} apr_crypto_key_rec_t;

/**
 * @brief Perform once-only initialisation. Call once only.
 *
 * @param pool - pool to register any shutdown cleanups, etc
 * @return APR_NOTIMPL in case of no crypto support.
 */
APU_DECLARE(apr_status_t) apr_crypto_init(apr_pool_t *pool);

/**
 * @brief Zero out the buffer provided when the pool is cleaned up.
 *
 * @param pool - pool to register the cleanup
 * @param buffer - buffer to zero out
 * @param size - size of the buffer to zero out
 */
APU_DECLARE(apr_status_t) apr_crypto_clear(apr_pool_t *pool, void *buffer,
        apr_size_t size);

/**
 * @brief Always zero out the buffer provided, without being optimized out by
 * the compiler.
 *
 * @param buffer - buffer to zero out
 * @param size - size of the buffer to zero out
 */
APU_DECLARE(apr_status_t) apr_crypto_memzero(void *buffer, apr_size_t size);

/**
 * @brief Timing attacks safe buffers comparison, where the executing time does
 * not depend on the bytes compared but solely on the number of bytes.
 *
 * @param buf1 - first buffer to compare
 * @param buf2 - second buffer to compare
 * @param size - size of the buffers to compare
 * @return 1 if the buffers are equals, 0 otherwise.
 */
APU_DECLARE(int) apr_crypto_equals(const void *buf1, const void *buf2,
                                   apr_size_t size);

/**
 * @brief Get the driver struct for a name
 *
 * @param driver - pointer to driver struct.
 * @param name - driver name
 * @param params - array of initialisation parameters
 * @param result - result and error message on failure
 * @param pool - (process) pool to register cleanup
 * @return APR_SUCCESS for success
 * @return APR_ENOTIMPL for no driver (when DSO not enabled)
 * @return APR_EDSOOPEN if DSO driver file can't be opened
 * @return APR_ESYMNOTFOUND if the driver file doesn't contain a driver
 * @remarks NSS: the params can have "dir", "key3", "cert7" and "secmod"
 *  keys, each followed by an equal sign and a value. Such key/value pairs can
 *  be delimited by space or tab. If the value contains a space, surround the
 *  whole key value pair in quotes: "dir=My Directory".
 * @remarks OpenSSL: currently no params are supported.
 */
APU_DECLARE(apr_status_t) apr_crypto_get_driver(
        const apr_crypto_driver_t **driver,
        const char *name, const char *params, const apu_err_t **result,
        apr_pool_t *pool);

/**
 * @brief Return the name of the driver.
 *
 * @param driver - The driver in use.
 * @return The name of the driver.
 */
APU_DECLARE(const char *) apr_crypto_driver_name(
        const apr_crypto_driver_t *driver);

/**
 * @brief Get the result of the last operation on a context. If the result
 *        is NULL, the operation was successful.
 * @param result - the result structure
 * @param f - context pointer
 * @return APR_SUCCESS for success
 */
APU_DECLARE(apr_status_t) apr_crypto_error(const apu_err_t **result,
        const apr_crypto_t *f);

/**
 * @brief Create a context for supporting encryption. Keys, certificates,
 *        algorithms and other parameters will be set per context. More than
 *        one context can be created at one time. A cleanup will be automatically
 *        registered with the given pool to guarantee a graceful shutdown.
 * @param f - context pointer will be written here
 * @param driver - driver to use
 * @param params - array of key parameters
 * @param pool - process pool
 * @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
 * if the engine cannot be initialised.
 * @remarks NSS: currently no params are supported.
 * @remarks OpenSSL: the params can have "engine" as a key, followed by an equal
 *  sign and a value.
 */
APU_DECLARE(apr_status_t) apr_crypto_make(apr_crypto_t **f,
        const apr_crypto_driver_t *driver, const char *params,
        apr_pool_t *pool);

/**
 * @brief Get a hash table of key types, keyed by the name of the type against
 * a pointer to apr_crypto_block_key_type_t, which in turn begins with an
 * integer.
 *
 * @param types - hashtable of key types keyed to constants.
 * @param f - encryption context
 * @return APR_SUCCESS for success
 */
APU_DECLARE(apr_status_t) apr_crypto_get_block_key_types(apr_hash_t **types,
        const apr_crypto_t *f);

/**
 * @brief Get a hash table of key modes, keyed by the name of the mode against
 * a pointer to apr_crypto_block_key_mode_t, which in turn begins with an
 * integer.
 *
 * @param modes - hashtable of key modes keyed to constants.
 * @param f - encryption context
 * @return APR_SUCCESS for success
 */
APU_DECLARE(apr_status_t) apr_crypto_get_block_key_modes(apr_hash_t **modes,
        const apr_crypto_t *f);

/**
 * @brief Create a key from the provided secret or passphrase. The key is cleaned
 *        up when the context is cleaned, and may be reused with multiple encryption
 *        or decryption operations.
 * @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
 *       *key is not NULL, *key must point at a previously created structure.
 * @param key The key returned, see note.
 * @param rec The key record, from which the key will be derived.
 * @param f The context to use.
 * @param p The pool to use.
 * @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
 *         error occurred while generating the key. APR_ENOCIPHER if the type or mode
 *         is not supported by the particular backend. APR_EKEYTYPE if the key type is
 *         not known. APR_EPADDING if padding was requested but is not supported.
 *         APR_ENOTIMPL if not implemented.
 */
APU_DECLARE(apr_status_t) apr_crypto_key(apr_crypto_key_t **key,
        const apr_crypto_key_rec_t *rec, const apr_crypto_t *f, apr_pool_t *p);

/**
 * @brief Create a key from the given passphrase. By default, the PBKDF2
 *        algorithm is used to generate the key from the passphrase. It is expected
 *        that the same pass phrase will generate the same key, regardless of the
 *        backend crypto platform used. The key is cleaned up when the context
 *        is cleaned, and may be reused with multiple encryption or decryption
 *        operations.
 * @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
 *       *key is not NULL, *key must point at a previously created structure.
 * @param key The key returned, see note.
 * @param ivSize The size of the initialisation vector will be returned, based
 *               on whether an IV is relevant for this type of crypto.
 * @param pass The passphrase to use.
 * @param passLen The passphrase length in bytes
 * @param salt The salt to use.
 * @param saltLen The salt length in bytes
 * @param type 3DES_192, AES_128, AES_192, AES_256.
 * @param mode Electronic Code Book / Cipher Block Chaining.
 * @param doPad Pad if necessary.
 * @param iterations Number of iterations to use in algorithm
 * @param f The context to use.
 * @param p The pool to use.
 * @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
 *         error occurred while generating the key. APR_ENOCIPHER if the type or mode
 *         is not supported by the particular backend. APR_EKEYTYPE if the key type is
 *         not known. APR_EPADDING if padding was requested but is not supported.
 *         APR_ENOTIMPL if not implemented.
 * @deprecated Replaced by apr_crypto_key().
 */
APU_DECLARE(apr_status_t) apr_crypto_passphrase(apr_crypto_key_t **key,
        apr_size_t *ivSize, const char *pass, apr_size_t passLen,
        const unsigned char * salt, apr_size_t saltLen,
        const apr_crypto_block_key_type_e type,
        const apr_crypto_block_key_mode_e mode, const int doPad,
        const int iterations, const apr_crypto_t *f, apr_pool_t *p);

/**
 * @brief Initialise a context for encrypting arbitrary data using the given key.
 * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
 *       *ctx is not NULL, *ctx must point at a previously created structure.
 * @param ctx The block context returned, see note.
 * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
 *           an IV will be created at random, in space allocated from the pool.
 *           If the buffer pointed to is not NULL, the IV in the buffer will be
 *           used.
 * @param key The key structure to use.
 * @param blockSize The block size of the cipher.
 * @param p The pool to use.
 * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
 *         Returns APR_EINIT if the backend failed to initialise the context. Returns
 *         APR_ENOTIMPL if not implemented.
 */
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_init(
        apr_crypto_block_t **ctx, const unsigned char **iv,
        const apr_crypto_key_t *key, apr_size_t *blockSize, apr_pool_t *p);

/**
 * @brief Encrypt data provided by in, write it to out.
 * @note The number of bytes written will be written to outlen. If
 *       out is NULL, outlen will contain the maximum size of the
 *       buffer needed to hold the data, including any data
 *       generated by apr_crypto_block_encrypt_finish below. If *out points
 *       to NULL, a buffer sufficiently large will be created from
 *       the pool provided. If *out points to a not-NULL value, this
 *       value will be used as a buffer instead.
 * @param out Address of a buffer to which data will be written,
 *        see note.
 * @param outlen Length of the output will be written here.
 * @param in Address of the buffer to read.
 * @param inlen Length of the buffer to read.
 * @param ctx The block context to use.
 * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
 *         not implemented.
 */
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt(unsigned char **out,
        apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
        apr_crypto_block_t *ctx);

/**
 * @brief Encrypt final data block, write it to out.
 * @note If necessary the final block will be written out after being
 *       padded. Typically the final block will be written to the
 *       same buffer used by apr_crypto_block_encrypt, offset by the
 *       number of bytes returned as actually written by the
 *       apr_crypto_block_encrypt() call. After this call, the context
 *       is cleaned and can be reused by apr_crypto_block_encrypt_init().
 * @param out Address of a buffer to which data will be written. This
 *            buffer must already exist, and is usually the same
 *            buffer used by apr_evp_crypt(). See note.
 * @param outlen Length of the output will be written here.
 * @param ctx The block context to use.
 * @return APR_ECRYPT if an error occurred.
 * @return APR_EPADDING if padding was enabled and the block was incorrectly
 *         formatted.
 * @return APR_ENOTIMPL if not implemented.
 */
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_finish(unsigned char *out,
        apr_size_t *outlen, apr_crypto_block_t *ctx);

/**
 * @brief Initialise a context for decrypting arbitrary data using the given key.
 * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
 *       *ctx is not NULL, *ctx must point at a previously created structure.
 * @param ctx The block context returned, see note.
 * @param blockSize The block size of the cipher.
 * @param iv Optional initialisation vector.
 * @param key The key structure to use.
 * @param p The pool to use.
 * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
 *         Returns APR_EINIT if the backend failed to initialise the context. Returns
 *         APR_ENOTIMPL if not implemented.
 */
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_init(
        apr_crypto_block_t **ctx, apr_size_t *blockSize,
        const unsigned char *iv, const apr_crypto_key_t *key, apr_pool_t *p);

/**
 * @brief Decrypt data provided by in, write it to out.
 * @note The number of bytes written will be written to outlen. If
 *       out is NULL, outlen will contain the maximum size of the
 *       buffer needed to hold the data, including any data
 *       generated by apr_crypto_block_decrypt_finish below. If *out points
 *       to NULL, a buffer sufficiently large will be created from
 *       the pool provided. If *out points to a not-NULL value, this
 *       value will be used as a buffer instead.
 * @param out Address of a buffer to which data will be written,
 *        see note.
 * @param outlen Length of the output will be written here.
 * @param in Address of the buffer to read.
 * @param inlen Length of the buffer to read.
 * @param ctx The block context to use.
 * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
 *         not implemented.
 */
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt(unsigned char **out,
        apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
        apr_crypto_block_t *ctx);

/**
 * @brief Decrypt final data block, write it to out.
 * @note If necessary the final block will be written out after being
 *       padded. Typically the final block will be written to the
 *       same buffer used by apr_crypto_block_decrypt, offset by the
 *       number of bytes returned as actually written by the
 *       apr_crypto_block_decrypt() call. After this call, the context
 *       is cleaned and can be reused by apr_crypto_block_decrypt_init().
 * @param out Address of a buffer to which data will be written. This
 *            buffer must already exist, and is usually the same
 *            buffer used by apr_evp_crypt(). See note.
 * @param outlen Length of the output will be written here.
 * @param ctx The block context to use.
 * @return APR_ECRYPT if an error occurred.
 * @return APR_EPADDING if padding was enabled and the block was incorrectly
 *         formatted.
 * @return APR_ENOTIMPL if not implemented.
 */
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_finish(unsigned char *out,
        apr_size_t *outlen, apr_crypto_block_t *ctx);

/**
 * @brief Clean encryption / decryption context.
 * @note After cleanup, a context is free to be reused if necessary.
 * @param ctx The block context to use.
 * @return Returns APR_ENOTIMPL if not supported.
 */
APU_DECLARE(apr_status_t) apr_crypto_block_cleanup(apr_crypto_block_t *ctx);

/**
 * @brief Clean encryption / decryption context.
 * @note After cleanup, a context is free to be reused if necessary.
 * @param f The context to use.
 * @return Returns APR_ENOTIMPL if not supported.
 */
APU_DECLARE(apr_status_t) apr_crypto_cleanup(apr_crypto_t *f);

/**
 * @brief Shutdown the crypto library.
 * @note After shutdown, it is expected that the init function can be called again.
 * @param driver - driver to use
 * @return Returns APR_ENOTIMPL if not supported.
 */
APU_DECLARE(apr_status_t) apr_crypto_shutdown(
        const apr_crypto_driver_t *driver);

#endif /* APU_HAVE_CRYPTO */

/** @} */

#ifdef __cplusplus
}
#endif

#endif
include/apr-1/apr_network_io.h000064400000110021150336140420012273 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_NETWORK_IO_H
#define APR_NETWORK_IO_H
/**
 * @file apr_network_io.h
 * @brief APR Network library
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_file_io.h"
#include "apr_errno.h"
#include "apr_inherit.h" 
#include "apr_perms_set.h"

#if APR_HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#if APR_HAVE_SYS_UN_H
#include <sys/un.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_network_io Network Routines
 * @ingroup APR 
 * @{
 */

#ifndef APR_MAX_SECS_TO_LINGER
/** Maximum seconds to linger */
#define APR_MAX_SECS_TO_LINGER 30
#endif

#ifndef APRMAXHOSTLEN
/** Maximum hostname length */
#define APRMAXHOSTLEN 256
#endif

#ifndef APR_ANYADDR
/** Default 'any' address */
#define APR_ANYADDR "0.0.0.0"
#endif

/**
 * @defgroup apr_sockopt Socket option definitions
 * @{
 */
#define APR_SO_LINGER        1    /**< Linger */
#define APR_SO_KEEPALIVE     2    /**< Keepalive */
#define APR_SO_DEBUG         4    /**< Debug */
#define APR_SO_NONBLOCK      8    /**< Non-blocking IO */
#define APR_SO_REUSEADDR     16   /**< Reuse addresses */
#define APR_SO_SNDBUF        64   /**< Send buffer */
#define APR_SO_RCVBUF        128  /**< Receive buffer */
#define APR_SO_DISCONNECTED  256  /**< Disconnected */
#define APR_TCP_NODELAY      512  /**< For SCTP sockets, this is mapped
                                   * to STCP_NODELAY internally.
                                   */
#define APR_TCP_NOPUSH       1024 /**< No push */
#define APR_RESET_NODELAY    2048 /**< This flag is ONLY set internally
                                   * when we set APR_TCP_NOPUSH with
                                   * APR_TCP_NODELAY set to tell us that
                                   * APR_TCP_NODELAY should be turned on
                                   * again when NOPUSH is turned off
                                   */
#define APR_INCOMPLETE_READ 4096  /**< Set on non-blocking sockets
				   * (timeout != 0) on which the
				   * previous read() did not fill a buffer
				   * completely.  the next apr_socket_recv() 
                                   * will first call select()/poll() rather than
				   * going straight into read().  (Can also
				   * be set by an application to force a
				   * select()/poll() call before the next
				   * read, in cases where the app expects
				   * that an immediate read would fail.)
				   */
#define APR_INCOMPLETE_WRITE 8192 /**< like APR_INCOMPLETE_READ, but for write
                                   * @see APR_INCOMPLETE_READ
                                   */
#define APR_IPV6_V6ONLY     16384 /**< Don't accept IPv4 connections on an
                                   * IPv6 listening socket.
                                   */
#define APR_TCP_DEFER_ACCEPT 32768 /**< Delay accepting of new connections 
                                    * until data is available.
                                    * @see apr_socket_accept_filter
                                    */
#define APR_SO_BROADCAST     65536 /**< Allow broadcast
                                    */
#define APR_SO_FREEBIND     131072 /**< Allow binding to addresses not owned
                                    * by any interface
                                    */

/** @} */

/** Define what type of socket shutdown should occur. */
typedef enum {
    APR_SHUTDOWN_READ,          /**< no longer allow read request */
    APR_SHUTDOWN_WRITE,         /**< no longer allow write requests */
    APR_SHUTDOWN_READWRITE      /**< no longer allow read or write requests */
} apr_shutdown_how_e;

#define APR_IPV4_ADDR_OK  0x01  /**< @see apr_sockaddr_info_get() */
#define APR_IPV6_ADDR_OK  0x02  /**< @see apr_sockaddr_info_get() */

#if (!APR_HAVE_IN_ADDR)
/**
 * We need to make sure we always have an in_addr type, so APR will just
 * define it ourselves, if the platform doesn't provide it.
 */
struct in_addr {
    apr_uint32_t  s_addr; /**< storage to hold the IP# */
};
#endif

/** @def APR_INADDR_NONE
 * Not all platforms have a real INADDR_NONE.  This macro replaces
 * INADDR_NONE on all platforms.
 */
#ifdef INADDR_NONE
#define APR_INADDR_NONE INADDR_NONE
#else
#define APR_INADDR_NONE ((unsigned int) 0xffffffff)
#endif

/**
 * @def APR_INET
 * Not all platforms have these defined, so we'll define them here
 * The default values come from FreeBSD 4.1.1
 */
#define APR_INET     AF_INET
/** @def APR_UNSPEC
 * Let the system decide which address family to use
 */
#ifdef AF_UNSPEC
#define APR_UNSPEC   AF_UNSPEC
#else
#define APR_UNSPEC   0
#endif
#if APR_HAVE_IPV6
/** @def APR_INET6
* IPv6 Address Family. Not all platforms may have this defined.
*/

#define APR_INET6    AF_INET6
#endif

#if APR_HAVE_SOCKADDR_UN
#if defined (AF_UNIX)
#define APR_UNIX    AF_UNIX
#elif defined(AF_LOCAL)
#define APR_UNIX    AF_LOCAL
#else
#error "Neither AF_UNIX nor AF_LOCAL is defined"
#endif
#else /* !APR_HAVE_SOCKADDR_UN */
#if defined (AF_UNIX)
#define APR_UNIX    AF_UNIX
#elif defined(AF_LOCAL)
#define APR_UNIX    AF_LOCAL
#else
/* TODO: Use a smarter way to detect unique APR_UNIX value */
#define APR_UNIX    1234
#endif
#endif

/**
 * @defgroup IP_Proto IP Protocol Definitions for use when creating sockets
 * @{
 */
#define APR_PROTO_TCP       6   /**< TCP  */
#define APR_PROTO_UDP      17   /**< UDP  */
#define APR_PROTO_SCTP    132   /**< SCTP */
/** @} */

/**
 * Enum used to denote either the local and remote endpoint of a
 * connection.
 */
typedef enum {
    APR_LOCAL,   /**< Socket information for local end of connection */
    APR_REMOTE   /**< Socket information for remote end of connection */
} apr_interface_e;

/**
 * The specific declaration of inet_addr's ... some platforms fall back
 * inet_network (this is not good, but necessary)
 */

#if APR_HAVE_INET_ADDR
#define apr_inet_addr    inet_addr
#elif APR_HAVE_INET_NETWORK        /* only DGUX, as far as I know */
/**
 * @warning
 * not generally safe... inet_network() and inet_addr() perform
 * different functions */
#define apr_inet_addr    inet_network
#endif

/** A structure to represent sockets */
typedef struct apr_socket_t     apr_socket_t;
/**
 * A structure to encapsulate headers and trailers for apr_socket_sendfile
 */
typedef struct apr_hdtr_t       apr_hdtr_t;
/** A structure to represent in_addr */
typedef struct in_addr          apr_in_addr_t;
/** A structure to represent an IP subnet */
typedef struct apr_ipsubnet_t apr_ipsubnet_t;

/** @remark use apr_uint16_t just in case some system has a short that isn't 16 bits... */
typedef apr_uint16_t            apr_port_t;

/** @remark It's defined here as I think it should all be platform safe...
 * @see apr_sockaddr_t
 */
typedef struct apr_sockaddr_t apr_sockaddr_t;
/**
 * APRs socket address type, used to ensure protocol independence
 */
struct apr_sockaddr_t {
    /** The pool to use... */
    apr_pool_t *pool;
    /** The hostname */
    char *hostname;
    /** Either a string of the port number or the service name for the port */
    char *servname;
    /** The numeric port */
    apr_port_t port;
    /** The family */
    apr_int32_t family;
    /** How big is the sockaddr we're using? */
    apr_socklen_t salen;
    /** How big is the ip address structure we're using? */
    int ipaddr_len;
    /** How big should the address buffer be?  16 for v4 or 46 for v6
     *  used in inet_ntop... */
    int addr_str_len;
    /** This points to the IP address structure within the appropriate
     *  sockaddr structure.  */
    void *ipaddr_ptr;
    /** If multiple addresses were found by apr_sockaddr_info_get(), this 
     *  points to a representation of the next address. */
    apr_sockaddr_t *next;
    /** Union of either IPv4 or IPv6 sockaddr. */
    union {
        /** IPv4 sockaddr structure */
        struct sockaddr_in sin;
#if APR_HAVE_IPV6
        /** IPv6 sockaddr structure */
        struct sockaddr_in6 sin6;
#endif
#if APR_HAVE_SA_STORAGE
        /** Placeholder to ensure that the size of this union is not
         * dependent on whether APR_HAVE_IPV6 is defined. */
        struct sockaddr_storage sas;
#endif
#if APR_HAVE_SOCKADDR_UN
        /** Unix domain socket sockaddr structure */
        struct sockaddr_un unx;
#endif
    } sa;
};

#if APR_HAS_SENDFILE
/** 
 * Support reusing the socket on platforms which support it (from disconnect,
 * specifically Win32.
 * @remark Optional flag passed into apr_socket_sendfile() 
 */
#define APR_SENDFILE_DISCONNECT_SOCKET      1
#endif

/** A structure to encapsulate headers and trailers for apr_socket_sendfile */
struct apr_hdtr_t {
    /** An iovec to store the headers sent before the file. */
    struct iovec* headers;
    /** number of headers in the iovec */
    int numheaders;
    /** An iovec to store the trailers sent after the file. */
    struct iovec* trailers;
    /** number of trailers in the iovec */
    int numtrailers;
};

/* function definitions */

/**
 * Create a socket.
 * @param new_sock The new socket that has been set up.
 * @param family The address family of the socket (e.g., APR_INET).
 * @param type The type of the socket (e.g., SOCK_STREAM).
 * @param protocol The protocol of the socket (e.g., APR_PROTO_TCP).
 * @param cont The pool for the apr_socket_t and associated storage.
 * @note The pool will be used by various functions that operate on the
 *       socket. The caller must ensure that it is not used by other threads
 *       at the same time.
 */
APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new_sock, 
                                            int family, int type,
                                            int protocol,
                                            apr_pool_t *cont);

/**
 * Shutdown either reading, writing, or both sides of a socket.
 * @param thesocket The socket to close 
 * @param how How to shutdown the socket.  One of:
 * <PRE>
 *            APR_SHUTDOWN_READ         no longer allow read requests
 *            APR_SHUTDOWN_WRITE        no longer allow write requests
 *            APR_SHUTDOWN_READWRITE    no longer allow read or write requests 
 * </PRE>
 * @see apr_shutdown_how_e
 * @remark This does not actually close the socket descriptor, it just
 *      controls which calls are still valid on the socket.
 */
APR_DECLARE(apr_status_t) apr_socket_shutdown(apr_socket_t *thesocket,
                                              apr_shutdown_how_e how);

/**
 * Close a socket.
 * @param thesocket The socket to close 
 */
APR_DECLARE(apr_status_t) apr_socket_close(apr_socket_t *thesocket);

/**
 * Bind the socket to its associated port
 * @param sock The socket to bind 
 * @param sa The socket address to bind to
 * @remark This may be where we will find out if there is any other process
 *      using the selected port.
 */
APR_DECLARE(apr_status_t) apr_socket_bind(apr_socket_t *sock, 
                                          apr_sockaddr_t *sa);

/**
 * Listen to a bound socket for connections.
 * @param sock The socket to listen on 
 * @param backlog The number of outstanding connections allowed in the sockets
 *                listen queue.  If this value is less than zero, the listen
 *                queue size is set to zero.  
 */
APR_DECLARE(apr_status_t) apr_socket_listen(apr_socket_t *sock, 
                                            apr_int32_t backlog);

/**
 * Accept a new connection request
 * @param new_sock A copy of the socket that is connected to the socket that
 *                 made the connection request.  This is the socket which should
 *                 be used for all future communication.
 * @param sock The socket we are listening on.
 * @param connection_pool The pool for the new socket.
 * @note The pool will be used by various functions that operate on the
 *       socket. The caller must ensure that it is not used by other threads
 *       at the same time.
 */
APR_DECLARE(apr_status_t) apr_socket_accept(apr_socket_t **new_sock, 
                                            apr_socket_t *sock,
                                            apr_pool_t *connection_pool);

/**
 * Issue a connection request to a socket either on the same machine 
 * or a different one.
 * @param sock The socket we wish to use for our side of the connection 
 * @param sa The address of the machine we wish to connect to.
 */
APR_DECLARE(apr_status_t) apr_socket_connect(apr_socket_t *sock,
                                             apr_sockaddr_t *sa);

/**
 * Determine whether the receive part of the socket has been closed by
 * the peer (such that a subsequent call to apr_socket_read would
 * return APR_EOF), if the socket's receive buffer is empty.  This
 * function does not block waiting for I/O.
 *
 * @param sock The socket to check
 * @param atreadeof If APR_SUCCESS is returned, *atreadeof is set to
 *                  non-zero if a subsequent read would return APR_EOF
 * @return an error is returned if it was not possible to determine the
 *         status, in which case *atreadeof is not changed.
 */
APR_DECLARE(apr_status_t) apr_socket_atreadeof(apr_socket_t *sock,
                                               int *atreadeof);

/**
 * Create apr_sockaddr_t from hostname, address family, and port.
 * @param sa The new apr_sockaddr_t.
 * @param hostname The hostname or numeric address string to resolve/parse, or
 *               NULL to build an address that corresponds to 0.0.0.0 or ::
 *               or in case of APR_UNIX family it is absolute socket filename.
 * @param family The address family to use, or APR_UNSPEC if the system should 
 *               decide.
 * @param port The port number.
 * @param flags Special processing flags:
 * <PRE>
 *       APR_IPV4_ADDR_OK          first query for IPv4 addresses; only look
 *                                 for IPv6 addresses if the first query failed;
 *                                 only valid if family is APR_UNSPEC and hostname
 *                                 isn't NULL; mutually exclusive with
 *                                 APR_IPV6_ADDR_OK
 *       APR_IPV6_ADDR_OK          first query for IPv6 addresses; only look
 *                                 for IPv4 addresses if the first query failed;
 *                                 only valid if family is APR_UNSPEC and hostname
 *                                 isn't NULL and APR_HAVE_IPV6; mutually exclusive
 *                                 with APR_IPV4_ADDR_OK
 * </PRE>
 * @param p The pool for the apr_sockaddr_t and associated storage.
 */
APR_DECLARE(apr_status_t) apr_sockaddr_info_get(apr_sockaddr_t **sa,
                                          const char *hostname,
                                          apr_int32_t family,
                                          apr_port_t port,
                                          apr_int32_t flags,
                                          apr_pool_t *p);

/**
 * Copy apr_sockaddr_t src to dst on pool p.
 * @param dst The destination apr_sockaddr_t.
 * @param src The source apr_sockaddr_t.
 * @param p The pool for the apr_sockaddr_t and associated storage.
 */
APR_DECLARE(apr_status_t) apr_sockaddr_info_copy(apr_sockaddr_t **dst,
                                                 const apr_sockaddr_t *src,
                                                 apr_pool_t *p);

/**
 * Set the zone of an IPv6 link-local address object.
 * @param sa Socket address object
 * @param zone_id Zone ID (textual "eth0" or numeric "3").
 * @return Returns APR_EBADIP for non-IPv6 socket or an IPv6 address
 * which isn't link-local.
 */
APR_DECLARE(apr_status_t) apr_sockaddr_zone_set(apr_sockaddr_t *sa,
                                                const char *zone_id);


/**
 * Retrieve the zone of an IPv6 link-local address object.
 * @param sa Socket address object
 * @param name If non-NULL, set to the textual representation of the zone id
 * @param id If non-NULL, set to the integer zone id
 * @param p Pool from which *name is allocated if used.
 * @return Returns APR_EBADIP for non-IPv6 socket or socket without any zone id
 * set, or other error if the interface could not be mapped to a name.
 * @remark Both name and id may be NULL, neither are modified if
 * non-NULL in error cases.
 */
APR_DECLARE(apr_status_t) apr_sockaddr_zone_get(const apr_sockaddr_t *sa,
                                                const char **name,
                                                apr_uint32_t *id,
                                                apr_pool_t *p);                                                
    
/**
 * Look up the host name from an apr_sockaddr_t.
 * @param hostname The hostname.
 * @param sa The apr_sockaddr_t.
 * @param flags Special processing flags.
 * @remark Results can vary significantly between platforms
 * when processing wildcard socket addresses.
 */
APR_DECLARE(apr_status_t) apr_getnameinfo(char **hostname,
                                          apr_sockaddr_t *sa,
                                          apr_int32_t flags);

/**
 * Parse hostname/IP address with scope id and port.
 *
 * Any of the following strings are accepted:
 *   8080                  (just the port number)
 *   www.apache.org        (just the hostname)
 *   www.apache.org:8080   (hostname and port number)
 *   [fe80::1]:80          (IPv6 numeric address string only)
 *   [fe80::1%eth0]        (IPv6 numeric address string and scope id)
 *
 * Invalid strings:
 *                         (empty string)
 *   [abc]                 (not valid IPv6 numeric address string)
 *   abc:65536             (invalid port number)
 *
 * @param addr The new buffer containing just the hostname.  On output, *addr 
 *             will be NULL if no hostname/IP address was specfied.
 * @param scope_id The new buffer containing just the scope id.  On output, 
 *                 *scope_id will be NULL if no scope id was specified.
 * @param port The port number.  On output, *port will be 0 if no port was 
 *             specified.
 *             ### FIXME: 0 is a legal port (per RFC 1700). this should
 *             ### return something besides zero if the port is missing.
 * @param str The input string to be parsed.
 * @param p The pool from which *addr and *scope_id are allocated.
 * @remark If scope id shouldn't be allowed, check for scope_id != NULL in 
 *         addition to checking the return code.  If addr/hostname should be 
 *         required, check for addr == NULL in addition to checking the 
 *         return code.
 */
APR_DECLARE(apr_status_t) apr_parse_addr_port(char **addr,
                                              char **scope_id,
                                              apr_port_t *port,
                                              const char *str,
                                              apr_pool_t *p);

/**
 * Get name of the current machine
 * @param buf A buffer to store the hostname in.
 * @param len The maximum length of the hostname that can be stored in the
 *            buffer provided.  The suggested length is APRMAXHOSTLEN + 1.
 * @param cont The pool to use.
 * @remark If the buffer was not large enough, an error will be returned.
 */
APR_DECLARE(apr_status_t) apr_gethostname(char *buf, int len, apr_pool_t *cont);

/**
 * Return the data associated with the current socket
 * @param data The user data associated with the socket.
 * @param key The key to associate with the user data.
 * @param sock The currently open socket.
 */
APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char *key,
                                              apr_socket_t *sock);

/**
 * Set the data associated with the current socket.
 * @param sock The currently open socket.
 * @param data The user data to associate with the socket.
 * @param key The key to associate with the data.
 * @param cleanup The cleanup to call when the socket is destroyed.
 */
APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *sock, void *data,
                                              const char *key,
                                              apr_status_t (*cleanup)(void*));

/**
 * Send data over a network.
 * @param sock The socket to send the data over.
 * @param buf The buffer which contains the data to be sent. 
 * @param len On entry, the number of bytes to send; on exit, the number
 *            of bytes sent.
 * @remark
 * <PRE>
 * This functions acts like a blocking write by default.  To change 
 * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
 * socket option.
 *
 * It is possible for both bytes to be sent and an error to be returned.
 *
 * APR_EINTR is never returned.
 * </PRE>
 */
APR_DECLARE(apr_status_t) apr_socket_send(apr_socket_t *sock, const char *buf, 
                                          apr_size_t *len);

/**
 * Send multiple buffers over a network.
 * @param sock The socket to send the data over.
 * @param vec The array of iovec structs containing the data to send 
 * @param nvec The number of iovec structs in the array
 * @param len Receives the number of bytes actually written
 * @remark
 * <PRE>
 * This functions acts like a blocking write by default.  To change 
 * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
 * socket option.
 * The number of bytes actually sent is stored in argument 4.
 *
 * It is possible for both bytes to be sent and an error to be returned.
 *
 * APR_EINTR is never returned.
 * </PRE>
 */
APR_DECLARE(apr_status_t) apr_socket_sendv(apr_socket_t *sock, 
                                           const struct iovec *vec,
                                           apr_int32_t nvec, apr_size_t *len);

/**
 * @param sock The socket to send from
 * @param where The apr_sockaddr_t describing where to send the data
 * @param flags The flags to use
 * @param buf  The data to send
 * @param len  The length of the data to send
 */
APR_DECLARE(apr_status_t) apr_socket_sendto(apr_socket_t *sock, 
                                            apr_sockaddr_t *where,
                                            apr_int32_t flags, const char *buf, 
                                            apr_size_t *len);

/**
 * Read data from a socket.  On success, the address of the peer from
 * which the data was sent is copied into the @a from parameter, and the
 * @a len parameter is updated to give the number of bytes written to
 * @a buf.
 *
 * @param from Updated with the address from which the data was received
 * @param sock The socket to use
 * @param flags The flags to use
 * @param buf  The buffer to use
 * @param len  The length of the available buffer
 */

APR_DECLARE(apr_status_t) apr_socket_recvfrom(apr_sockaddr_t *from, 
                                              apr_socket_t *sock,
                                              apr_int32_t flags, char *buf, 
                                              apr_size_t *len);
 
#if APR_HAS_SENDFILE || defined(DOXYGEN)

/**
 * Send a file from an open file descriptor to a socket, along with 
 * optional headers and trailers
 * @param sock The socket to which we're writing
 * @param file The open file from which to read
 * @param hdtr A structure containing the headers and trailers to send
 * @param offset Offset into the file where we should begin writing
 * @param len (input)  - Number of bytes to send from the file 
 *            (output) - Number of bytes actually sent, 
 *                       including headers, file, and trailers
 * @param flags APR flags that are mapped to OS specific flags
 * @remark This functions acts like a blocking write by default.  To change 
 *         this behavior, use apr_socket_timeout_set() or the
 *         APR_SO_NONBLOCK socket option.
 * The number of bytes actually sent is stored in the len parameter.
 * The offset parameter is passed by reference for no reason; its
 * value will never be modified by the apr_socket_sendfile() function.
 */
APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock, 
                                              apr_file_t *file,
                                              apr_hdtr_t *hdtr,
                                              apr_off_t *offset,
                                              apr_size_t *len,
                                              apr_int32_t flags);

#endif /* APR_HAS_SENDFILE */

/**
 * Read data from a network.
 * @param sock The socket to read the data from.
 * @param buf The buffer to store the data in. 
 * @param len On entry, the number of bytes to receive; on exit, the number
 *            of bytes received.
 * @remark
 * <PRE>
 * This functions acts like a blocking read by default.  To change 
 * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
 * socket option.
 * The number of bytes actually received is stored in argument 3.
 *
 * It is possible for both bytes to be received and an APR_EOF or
 * other error to be returned.
 *
 * APR_EINTR is never returned.
 * </PRE>
 */
APR_DECLARE(apr_status_t) apr_socket_recv(apr_socket_t *sock, 
                                   char *buf, apr_size_t *len);

/**
 * Setup socket options for the specified socket
 * @param sock The socket to set up.
 * @param opt The option we would like to configure.  One of:
 * <PRE>
 *            APR_SO_DEBUG      --  turn on debugging information 
 *            APR_SO_KEEPALIVE  --  keep connections active
 *            APR_SO_LINGER     --  lingers on close if data is present
 *            APR_SO_NONBLOCK   --  Turns blocking on/off for socket
 *                                  When this option is enabled, use
 *                                  the APR_STATUS_IS_EAGAIN() macro to
 *                                  see if a send or receive function
 *                                  could not transfer data without
 *                                  blocking.
 *            APR_SO_REUSEADDR  --  The rules used in validating addresses
 *                                  supplied to bind should allow reuse
 *                                  of local addresses.
 *            APR_SO_SNDBUF     --  Set the SendBufferSize
 *            APR_SO_RCVBUF     --  Set the ReceiveBufferSize
 *            APR_SO_FREEBIND   --  Allow binding to non-local IP address.
 * </PRE>
 * @param on Value for the option.
 */
APR_DECLARE(apr_status_t) apr_socket_opt_set(apr_socket_t *sock,
                                             apr_int32_t opt, apr_int32_t on);

/**
 * Setup socket timeout for the specified socket
 * @param sock The socket to set up.
 * @param t Value for the timeout.
 * <PRE>
 *   t > 0  -- read and write calls return APR_TIMEUP if specified time
 *             elapsess with no data read or written
 *   t == 0 -- read and write calls never block
 *   t < 0  -- read and write calls block
 * </PRE>
 */
APR_DECLARE(apr_status_t) apr_socket_timeout_set(apr_socket_t *sock,
                                                 apr_interval_time_t t);

/**
 * Query socket options for the specified socket
 * @param sock The socket to query
 * @param opt The option we would like to query.  One of:
 * <PRE>
 *            APR_SO_DEBUG      --  turn on debugging information 
 *            APR_SO_KEEPALIVE  --  keep connections active
 *            APR_SO_LINGER     --  lingers on close if data is present
 *            APR_SO_NONBLOCK   --  Turns blocking on/off for socket
 *            APR_SO_REUSEADDR  --  The rules used in validating addresses
 *                                  supplied to bind should allow reuse
 *                                  of local addresses.
 *            APR_SO_SNDBUF     --  Set the SendBufferSize
 *            APR_SO_RCVBUF     --  Set the ReceiveBufferSize
 *            APR_SO_DISCONNECTED -- Query the disconnected state of the socket.
 *                                  (Currently only used on Windows)
 * </PRE>
 * @param on Socket option returned on the call.
 */
APR_DECLARE(apr_status_t) apr_socket_opt_get(apr_socket_t *sock, 
                                             apr_int32_t opt, apr_int32_t *on);

/**
 * Query socket timeout for the specified socket
 * @param sock The socket to query
 * @param t Socket timeout returned from the query.
 */
APR_DECLARE(apr_status_t) apr_socket_timeout_get(apr_socket_t *sock, 
                                                 apr_interval_time_t *t);

/**
 * Query the specified socket if at the OOB/Urgent data mark
 * @param sock The socket to query
 * @param atmark Is set to true if socket is at the OOB/urgent mark,
 *               otherwise is set to false.
 */
APR_DECLARE(apr_status_t) apr_socket_atmark(apr_socket_t *sock, 
                                            int *atmark);

/**
 * Return an address associated with a socket; either the address to
 * which the socket is bound locally or the address of the peer
 * to which the socket is connected.
 * @param sa The returned apr_sockaddr_t.
 * @param which Whether to retrieve the local or remote address
 * @param sock The socket to use
 */
APR_DECLARE(apr_status_t) apr_socket_addr_get(apr_sockaddr_t **sa,
                                              apr_interface_e which,
                                              apr_socket_t *sock);
 
/**
 * Return the IP address (in numeric address string format) in
 * an APR socket address.  APR will allocate storage for the IP address 
 * string from the pool of the apr_sockaddr_t.
 * @param addr The IP address.
 * @param sockaddr The socket address to reference.
 */
APR_DECLARE(apr_status_t) apr_sockaddr_ip_get(char **addr, 
                                              apr_sockaddr_t *sockaddr);

/**
 * Write the IP address (in numeric address string format) of the APR
 * socket address @a sockaddr into the buffer @a buf (of size @a buflen).
 * @param sockaddr The socket address to reference.
 */
APR_DECLARE(apr_status_t) apr_sockaddr_ip_getbuf(char *buf, apr_size_t buflen,
                                                 apr_sockaddr_t *sockaddr);

/**
 * See if the IP addresses in two APR socket addresses are
 * equivalent.  Appropriate logic is present for comparing
 * IPv4-mapped IPv6 addresses with IPv4 addresses.
 *
 * @param addr1 One of the APR socket addresses.
 * @param addr2 The other APR socket address.
 * @remark The return value will be non-zero if the addresses
 * are equivalent.
 */
APR_DECLARE(int) apr_sockaddr_equal(const apr_sockaddr_t *addr1,
                                    const apr_sockaddr_t *addr2);

/**
 * See if the IP address in an APR socket address refers to the wildcard
 * address for the protocol family (e.g., INADDR_ANY for IPv4).
 *
 * @param addr The APR socket address to examine.
 * @remark The return value will be non-zero if the address is
 * initialized and is the wildcard address.
 */
APR_DECLARE(int) apr_sockaddr_is_wildcard(const apr_sockaddr_t *addr);

/**
* Return the type of the socket.
* @param sock The socket to query.
* @param type The returned type (e.g., SOCK_STREAM).
*/
APR_DECLARE(apr_status_t) apr_socket_type_get(apr_socket_t *sock,
                                              int *type);
 
/**
 * Given an apr_sockaddr_t and a service name, set the port for the service
 * @param sockaddr The apr_sockaddr_t that will have its port set
 * @param servname The name of the service you wish to use
 */
APR_DECLARE(apr_status_t) apr_getservbyname(apr_sockaddr_t *sockaddr, 
                                            const char *servname);
/**
 * Build an ip-subnet representation from an IP address and optional netmask or
 * number-of-bits.
 * @param ipsub The new ip-subnet representation
 * @param ipstr The input IP address string
 * @param mask_or_numbits The input netmask or number-of-bits string, or NULL
 * @param p The pool to allocate from
 */
APR_DECLARE(apr_status_t) apr_ipsubnet_create(apr_ipsubnet_t **ipsub, 
                                              const char *ipstr, 
                                              const char *mask_or_numbits, 
                                              apr_pool_t *p);

/**
 * Test the IP address in an apr_sockaddr_t against a pre-built ip-subnet
 * representation.
 * @param ipsub The ip-subnet representation
 * @param sa The socket address to test
 * @return non-zero if the socket address is within the subnet, 0 otherwise
 */
APR_DECLARE(int) apr_ipsubnet_test(apr_ipsubnet_t *ipsub, apr_sockaddr_t *sa);

#if APR_HAS_SO_ACCEPTFILTER || defined(DOXYGEN)
/**
 * Set an OS level accept filter.
 * @param sock The socket to put the accept filter on.
 * @param name The accept filter
 * @param args Any extra args to the accept filter.  Passing NULL here removes
 *             the accept filter. 
 * @bug name and args should have been declared as const char *, as they are in
 * APR 2.0
 */
apr_status_t apr_socket_accept_filter(apr_socket_t *sock, char *name,
                                      char *args);
#endif

/**
 * Return the protocol of the socket.
 * @param sock The socket to query.
 * @param protocol The returned protocol (e.g., APR_PROTO_TCP).
 */
APR_DECLARE(apr_status_t) apr_socket_protocol_get(apr_socket_t *sock,
                                                  int *protocol);

/**
 * Get the pool used by the socket.
 */
APR_POOL_DECLARE_ACCESSOR(socket);

/**
 * Set a socket to be inherited by child processes.
 */
APR_DECLARE_INHERIT_SET(socket);

/**
 * Unset a socket from being inherited by child processes.
 */
APR_DECLARE_INHERIT_UNSET(socket);

/**
 * Set socket permissions.
 */
APR_PERMS_SET_IMPLEMENT(socket);

/**
 * @defgroup apr_mcast IP Multicast
 * @{
 */

/**
 * Join a Multicast Group
 * @param sock The socket to join a multicast group
 * @param join The address of the multicast group to join
 * @param iface Address of the interface to use.  If NULL is passed, the 
 *              default multicast interface will be used. (OS Dependent)
 * @param source Source Address to accept transmissions from (non-NULL 
 *               implies Source-Specific Multicast)
 */
APR_DECLARE(apr_status_t) apr_mcast_join(apr_socket_t *sock,
                                         apr_sockaddr_t *join,
                                         apr_sockaddr_t *iface,
                                         apr_sockaddr_t *source);

/**
 * Leave a Multicast Group.  All arguments must be the same as
 * apr_mcast_join.
 * @param sock The socket to leave a multicast group
 * @param addr The address of the multicast group to leave
 * @param iface Address of the interface to use.  If NULL is passed, the 
 *              default multicast interface will be used. (OS Dependent)
 * @param source Source Address to accept transmissions from (non-NULL 
 *               implies Source-Specific Multicast)
 */
APR_DECLARE(apr_status_t) apr_mcast_leave(apr_socket_t *sock,
                                          apr_sockaddr_t *addr,
                                          apr_sockaddr_t *iface,
                                          apr_sockaddr_t *source);

/**
 * Set the Multicast Time to Live (ttl) for a multicast transmission.
 * @param sock The socket to set the multicast ttl
 * @param ttl Time to live to Assign. 0-255, default=1
 * @remark If the TTL is 0, packets will only be seen by sockets on 
 * the local machine, and only when multicast loopback is enabled.
 */
APR_DECLARE(apr_status_t) apr_mcast_hops(apr_socket_t *sock,
                                         apr_byte_t ttl);

/**
 * Toggle IP Multicast Loopback
 * @param sock The socket to set multicast loopback
 * @param opt 0=disable, 1=enable
 */
APR_DECLARE(apr_status_t) apr_mcast_loopback(apr_socket_t *sock,
                                             apr_byte_t opt);


/**
 * Set the Interface to be used for outgoing Multicast Transmissions.
 * @param sock The socket to set the multicast interface on
 * @param iface Address of the interface to use for Multicast
 */
APR_DECLARE(apr_status_t) apr_mcast_interface(apr_socket_t *sock,
                                              apr_sockaddr_t *iface);

/** @} */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_NETWORK_IO_H */

include/apr-1/apr_dbm.h000064400000020627150336140420010671 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_DBM_H
#define APR_DBM_H

#include "apu.h"
#include "apr.h"
#include "apr_errno.h"
#include "apr_pools.h"
#include "apr_file_info.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @file apr_dbm.h
 * @brief APR-UTIL DBM library
 */
/** 
 * @defgroup APR_Util_DBM DBM routines
 * @ingroup APR_Util
 * @{
 */
/**
 * Structure for referencing a dbm
 */
typedef struct apr_dbm_t apr_dbm_t;

/**
 * Structure for referencing the datum record within a dbm
 */
typedef struct
{
    /** pointer to the 'data' to retrieve/store in the DBM */
    char *dptr;
    /** size of the 'data' to retrieve/store in the DBM */
    apr_size_t dsize;
} apr_datum_t;

/* modes to open the DB */
#define APR_DBM_READONLY        1       /**< open for read-only access */
#define APR_DBM_READWRITE       2       /**< open for read-write access */
#define APR_DBM_RWCREATE        3       /**< open for r/w, create if needed */
#define APR_DBM_RWTRUNC         4       /**< open for r/w, truncating an existing
                                          DB if present */
/**
 * Open a dbm file by file name and type of DBM
 * @param dbm The newly opened database
 * @param type The type of the DBM (not all may be available at run time)
 * <pre>
 *  db   for Berkeley DB files
 *  gdbm for GDBM files
 *  ndbm for NDBM files
 *  sdbm for SDBM files (always available)
 *  default for the default DBM type
 *  </pre>
 * @param name The dbm file name to open
 * @param mode The flag value
 * <PRE>
 *           APR_DBM_READONLY   open for read-only access
 *           APR_DBM_READWRITE  open for read-write access
 *           APR_DBM_RWCREATE   open for r/w, create if needed
 *           APR_DBM_RWTRUNC    open for r/w, truncate if already there
 * </PRE>
 * @param perm Permissions to apply to if created
 * @param cntxt The pool to use when creating the dbm
 * @remark The dbm name may not be a true file name, as many dbm packages
 * append suffixes for seperate data and index files.
 * @bug In apr-util 0.9 and 1.x, the type arg was case insensitive.  This
 * was highly inefficient, and as of 2.x the dbm name must be provided in
 * the correct case (lower case for all bundled providers)
 */

APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **dbm, const char* type, 
                                       const char *name, 
                                       apr_int32_t mode, apr_fileperms_t perm,
                                       apr_pool_t *cntxt);


/**
 * Open a dbm file by file name
 * @param dbm The newly opened database
 * @param name The dbm file name to open
 * @param mode The flag value
 * <PRE>
 *           APR_DBM_READONLY   open for read-only access
 *           APR_DBM_READWRITE  open for read-write access
 *           APR_DBM_RWCREATE   open for r/w, create if needed
 *           APR_DBM_RWTRUNC    open for r/w, truncate if already there
 * </PRE>
 * @param perm Permissions to apply to if created
 * @param cntxt The pool to use when creating the dbm
 * @remark The dbm name may not be a true file name, as many dbm packages
 * append suffixes for seperate data and index files.
 */
APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **dbm, const char *name, 
                                       apr_int32_t mode, apr_fileperms_t perm,
                                       apr_pool_t *cntxt);

/**
 * Close a dbm file previously opened by apr_dbm_open
 * @param dbm The database to close
 */
APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm);

/**
 * Fetch a dbm record value by key
 * @param dbm The database 
 * @param key The key datum to find this record
 * @param pvalue The value datum retrieved for this record
 */
APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
                                        apr_datum_t *pvalue);
/**
 * Store a dbm record value by key
 * @param dbm The database 
 * @param key The key datum to store this record by
 * @param value The value datum to store in this record
 */
APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key, 
                                        apr_datum_t value);

/**
 * Delete a dbm record value by key
 * @param dbm The database 
 * @param key The key datum of the record to delete
 * @remark It is not an error to delete a non-existent record.
 */
APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key);

/**
 * Search for a key within the dbm
 * @param dbm The database 
 * @param key The datum describing a key to test
 */
APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key);

/**
 * Retrieve the first record key from a dbm
 * @param dbm The database 
 * @param pkey The key datum of the first record
 */
APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey);

/**
 * Retrieve the next record key from a dbm
 * @param dbm The database 
 * @param pkey The key datum of the next record
 */
APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey);

/**
 * Proactively toss any memory associated with the apr_datum_t.
 * @param dbm The database 
 * @param data The datum to free.
 */
APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data);

/**
 * Report more information when an apr_dbm function fails.
 * @param dbm The database
 * @param errcode A DBM-specific value for the error (for logging). If this
 *                isn't needed, it may be NULL.
 * @param errbuf Location to store the error text
 * @param errbufsize The size of the provided buffer
 * @return The errbuf parameter, for convenience.
 */
APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
                                     char *errbuf, apr_size_t errbufsize);
/**
 * If the specified file/path were passed to apr_dbm_open(), return the
 * actual file/path names which would be (created and) used. At most, two
 * files may be used; used2 may be NULL if only one file is used.
 * @param pool The pool for allocating used1 and used2.
 * @param type The type of DBM you require info on @see apr_dbm_open_ex
 * @param pathname The path name to generate used-names from.
 * @param used1 The first pathname used by the apr_dbm implementation.
 * @param used2 The second pathname used by apr_dbm. If only one file is
 *              used by the specific implementation, this will be set to NULL.
 * @return An error if the specified type is invalid.
 * @remark The dbm file(s) don't need to exist. This function only manipulates
 *      the pathnames.
 */
APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *pool,
                                                   const char *type,
                                                   const char *pathname,
                                                   const char **used1,
                                                   const char **used2);

/**
 * If the specified file/path were passed to apr_dbm_open(), return the
 * actual file/path names which would be (created and) used. At most, two
 * files may be used; used2 may be NULL if only one file is used.
 * @param pool The pool for allocating used1 and used2.
 * @param pathname The path name to generate used-names from.
 * @param used1 The first pathname used by the apr_dbm implementation.
 * @param used2 The second pathname used by apr_dbm. If only one file is
 *              used by the specific implementation, this will be set to NULL.
 * @remark The dbm file(s) don't need to exist. This function only manipulates
 *      the pathnames.
 */
APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *pool,
                                        const char *pathname,
                                        const char **used1,
                                        const char **used2);

/** @} */
#ifdef __cplusplus
}
#endif

#endif	/* !APR_DBM_H */
include/apr-1/apr_lib.h000064400000020356150336140420010674 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_LIB_H
#define APR_LIB_H

/**
 * @file apr_lib.h
 * This is collection of oddballs that didn't fit anywhere else,
 * and might move to more appropriate headers with the release
 * of APR 1.0.
 * @brief APR general purpose library routines
 */

#include "apr.h"
#include "apr_errno.h"

#if APR_HAVE_CTYPE_H
#include <ctype.h>
#endif
#if APR_HAVE_STDARG_H
#include <stdarg.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_lib General Purpose Library Routines
 * @ingroup APR 
 * This is collection of oddballs that didn't fit anywhere else,
 * and might move to more appropriate headers with the release
 * of APR 1.0.
 * @{
 */

/** A constant representing a 'large' string. */
#define HUGE_STRING_LEN 8192

/*
 * Define the structures used by the APR general-purpose library.
 */

/** @see apr_vformatter_buff_t */
typedef struct apr_vformatter_buff_t apr_vformatter_buff_t;

/**
 * Structure used by the variable-formatter routines.
 */
struct apr_vformatter_buff_t {
    /** The current position */
    char *curpos;
    /** The end position of the format string */
    char *endpos;
};

/**
 * return the final element of the pathname
 * @param pathname The path to get the final element of
 * @return the final element of the path
 * @remark
 * <PRE>
 * For example:
 *                 "/foo/bar/gum"    -> "gum"
 *                 "/foo/bar/gum/"   -> ""
 *                 "gum"             -> "gum"
 *                 "bs\\path\\stuff" -> "stuff"
 * </PRE>
 */
APR_DECLARE(const char *) apr_filepath_name_get(const char *pathname);

/**
 * apr_killpg
 * Small utility macros to make things easier to read.  Not usually a
 * goal, to be sure..
 */

#ifdef WIN32
#define apr_killpg(x, y)
#else /* WIN32 */
#ifdef NO_KILLPG
#define apr_killpg(x, y)        (kill (-(x), (y)))
#else /* NO_KILLPG */
#define apr_killpg(x, y)        (killpg ((x), (y)))
#endif /* NO_KILLPG */
#endif /* WIN32 */

/**
 * apr_vformatter() is a generic printf-style formatting routine
 * with some extensions.
 * @param flush_func The function to call when the buffer is full
 * @param c The buffer to write to
 * @param fmt The format string
 * @param ap The arguments to use to fill out the format string.
 *
 * @remark
 * <PRE>
 * The extensions are:
 *
 * - %%pA takes a struct in_addr *, and prints it as a.b.c.d
 * - %%pI takes an apr_sockaddr_t * and prints it as a.b.c.d:port or
 * \[ipv6-address\]:port
 * - %%pT takes an apr_os_thread_t * and prints it in decimal
 * ('0' is printed if !APR_HAS_THREADS)
 * - %%pt takes an apr_os_thread_t * and prints it in hexadecimal
 * ('0' is printed if !APR_HAS_THREADS)
 * - %%pm takes an apr_status_t * and prints the appropriate error
 * string (from apr_strerror) corresponding to that error code.
 * - %%pp takes a void * and outputs it in hex
 * - %%pB takes a apr_uint32_t * as bytes and outputs it's apr_strfsize
 * - %%pF same as above, but takes a apr_off_t *
 * - %%pS same as above, but takes a apr_size_t *
 *
 * %%pA, %%pI, %%pT, %%pp are available from APR 1.0.0 onwards (and in 0.9.x).
 * %%pt is only available from APR 1.2.0 onwards.
 * %%pm, %%pB, %%pF and %%pS are only available from APR 1.3.0 onwards.
 *
 * The %%p hacks are to force gcc's printf warning code to skip
 * over a pointer argument without complaining.  This does
 * mean that the ANSI-style %%p (output a void * in hex format) won't
 * work as expected at all, but that seems to be a fair trade-off
 * for the increased robustness of having printf-warnings work.
 *
 * Additionally, apr_vformatter allows for arbitrary output methods
 * using the apr_vformatter_buff and flush_func.
 *
 * The apr_vformatter_buff has two elements curpos and endpos.
 * curpos is where apr_vformatter will write the next byte of output.
 * It proceeds writing output to curpos, and updating curpos, until
 * either the end of output is reached, or curpos == endpos (i.e. the
 * buffer is full).
 *
 * If the end of output is reached, apr_vformatter returns the
 * number of bytes written.
 *
 * When the buffer is full, the flush_func is called.  The flush_func
 * can return -1 to indicate that no further output should be attempted,
 * and apr_vformatter will return immediately with -1.  Otherwise
 * the flush_func should flush the buffer in whatever manner is
 * appropriate, re apr_pool_t nitialize curpos and endpos, and return 0.
 *
 * Note that flush_func is only invoked as a result of attempting to
 * write another byte at curpos when curpos >= endpos.  So for
 * example, it's possible when the output exactly matches the buffer
 * space available that curpos == endpos will be true when
 * apr_vformatter returns.
 *
 * apr_vformatter does not call out to any other code, it is entirely
 * self-contained.  This allows the callers to do things which are
 * otherwise "unsafe".  For example, apr_psprintf uses the "scratch"
 * space at the unallocated end of a block, and doesn't actually
 * complete the allocation until apr_vformatter returns.  apr_psprintf
 * would be completely broken if apr_vformatter were to call anything
 * that used this same pool.  Similarly http_bprintf() uses the "scratch"
 * space at the end of its output buffer, and doesn't actually note
 * that the space is in use until it either has to flush the buffer
 * or until apr_vformatter returns.
 * </PRE>
 */
APR_DECLARE(int) apr_vformatter(int (*flush_func)(apr_vformatter_buff_t *b),
			        apr_vformatter_buff_t *c, const char *fmt,
			        va_list ap);

/**
 * Display a prompt and read in the password from stdin.
 * @param prompt The prompt to display
 * @param pwbuf Buffer to store the password
 * @param bufsize The length of the password buffer.
 * @remark If the password entered must be truncated to fit in
 * the provided buffer, APR_ENAMETOOLONG will be returned.
 * Note that the bufsize paramater is passed by reference for no
 * reason; its value will never be modified by the apr_password_get()
 * function.
 */
APR_DECLARE(apr_status_t) apr_password_get(const char *prompt, char *pwbuf, 
                                           apr_size_t *bufsize);

/** @} */

/**
 * @defgroup apr_ctype ctype functions
 * These macros allow correct support of 8-bit characters on systems which
 * support 8-bit characters.  Pretty dumb how the cast is required, but
 * that's legacy libc for ya.  These new macros do not support EOF like
 * the standard macros do.  Tough.
 * @{
 */
/** @see isalnum */
#define apr_isalnum(c) (isalnum(((unsigned char)(c))))
/** @see isalpha */
#define apr_isalpha(c) (isalpha(((unsigned char)(c))))
/** @see iscntrl */
#define apr_iscntrl(c) (iscntrl(((unsigned char)(c))))
/** @see isdigit */
#define apr_isdigit(c) (isdigit(((unsigned char)(c))))
/** @see isgraph */
#define apr_isgraph(c) (isgraph(((unsigned char)(c))))
/** @see islower*/
#define apr_islower(c) (islower(((unsigned char)(c))))
/** @see isascii */
#ifdef isascii
#define apr_isascii(c) (isascii(((unsigned char)(c))))
#else
#define apr_isascii(c) (((c) & ~0x7f)==0)
#endif
/** @see isprint */
#define apr_isprint(c) (isprint(((unsigned char)(c))))
/** @see ispunct */
#define apr_ispunct(c) (ispunct(((unsigned char)(c))))
/** @see isspace */
#define apr_isspace(c) (isspace(((unsigned char)(c))))
/** @see isupper */
#define apr_isupper(c) (isupper(((unsigned char)(c))))
/** @see isxdigit */
#define apr_isxdigit(c) (isxdigit(((unsigned char)(c))))
/** @see tolower */
#define apr_tolower(c) (tolower(((unsigned char)(c))))
/** @see toupper */
#define apr_toupper(c) (toupper(((unsigned char)(c))))

/** @} */

#ifdef __cplusplus
}
#endif

#endif	/* ! APR_LIB_H */
include/apr-1/apr_optional_hooks.h000064400000007440150336140420013155 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file apr_optional_hooks.h
 * @brief Apache optional hook functions
 */


#ifndef APR_OPTIONAL_HOOK_H
#define APR_OPTIONAL_HOOK_H

#include "apr_tables.h"

#ifdef __cplusplus
extern "C" {
#endif
/** 
 * @defgroup APR_Util_OPT_HOOK Optional Hook Functions
 * @ingroup APR_Util_Hook
 * @{
 */
/**
 * Function to implement the APR_OPTIONAL_HOOK Macro
 * @internal
 * @see APR_OPTIONAL_HOOK
 *
 * @param szName The name of the hook
 * @param pfn A pointer to a function that will be called
 * @param aszPre a NULL-terminated array of strings that name modules whose hooks should precede this one
 * @param aszSucc a NULL-terminated array of strings that name modules whose hooks should succeed this one
 * @param nOrder an integer determining order before honouring aszPre and aszSucc (for example HOOK_MIDDLE)
 */


APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),
					const char * const *aszPre,
					const char * const *aszSucc,
					int nOrder);

/**
 * Hook to an optional hook.
 *
 * @param ns The namespace prefix of the hook functions
 * @param name The name of the hook
 * @param pfn A pointer to a function that will be called
 * @param aszPre a NULL-terminated array of strings that name modules whose hooks should precede this one
 * @param aszSucc a NULL-terminated array of strings that name modules whose hooks should succeed this one
 * @param nOrder an integer determining order before honouring aszPre and aszSucc (for example HOOK_MIDDLE)
 */

#define APR_OPTIONAL_HOOK(ns,name,pfn,aszPre,aszSucc,nOrder) do { \
  ns##_HOOK_##name##_t *apu__hook = pfn; \
  apr_optional_hook_add(#name,(void (*)(void))apu__hook,aszPre, aszSucc, nOrder); \
} while (0)

/**
 * @internal
 * @param szName - the name of the function
 * @return the hook structure for a given hook
 */
APU_DECLARE(apr_array_header_t *) apr_optional_hook_get(const char *szName);

/**
 * Implement an optional hook that runs until one of the functions
 * returns something other than OK or DECLINE.
 *
 * @param ns The namespace prefix of the hook functions
 * @param link The linkage declaration prefix of the hook
 * @param ret The type of the return value of the hook
 * @param ret The type of the return value of the hook
 * @param name The name of the hook
 * @param args_decl The declaration of the arguments for the hook
 * @param args_use The names for the arguments for the hook
 * @param ok Success value
 * @param decline Decline value
 */
#define APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \
link##_DECLARE(ret) ns##_run_##name args_decl \
    { \
    ns##_LINK_##name##_t *pHook; \
    int n; \
    ret rv; \
    apr_array_header_t *pHookArray=apr_optional_hook_get(#name); \
\
    if(!pHookArray) \
	return ok; \
\
    pHook=(ns##_LINK_##name##_t *)pHookArray->elts; \
    for(n=0 ; n < pHookArray->nelts ; ++n) \
	{ \
	rv=(pHook[n].pFunc)args_use; \
\
	if(rv != ok && rv != decline) \
	    return rv; \
	} \
    return ok; \
    }

/** @} */
#ifdef __cplusplus
}
#endif

#endif /* APR_OPTIONAL_HOOK_H */
include/apr-1/apr_pools.h000064400000075700150336140420011265 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_POOLS_H
#define APR_POOLS_H

/**
 * @file apr_pools.h
 * @brief APR memory allocation
 *
 * Resource allocation routines...
 *
 * designed so that we don't have to keep track of EVERYTHING so that
 * it can be explicitly freed later (a fundamentally unsound strategy ---
 * particularly in the presence of die()).
 *
 * Instead, we maintain pools, and allocate items (both memory and I/O
 * handlers) from the pools --- currently there are two, one for
 * per-transaction info, and one for config info.  When a transaction is
 * over, we can delete everything in the per-transaction apr_pool_t without
 * fear, and without thinking too hard about it either.
 *
 * Note that most operations on pools are not thread-safe: a single pool
 * should only be accessed by a single thread at any given time. The one
 * exception to this rule is creating a subpool of a given pool: one or more
 * threads can safely create subpools at the same time that another thread
 * accesses the parent pool.
 */

#include "apr.h"
#include "apr_errno.h"
#include "apr_general.h" /* for APR_STRINGIFY */
#define APR_WANT_MEMFUNC /**< for no good reason? */
#include "apr_want.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup apr_pools Memory Pool Functions
 * @ingroup APR 
 * @{
 */

/** The fundamental pool type */
typedef struct apr_pool_t apr_pool_t;


/**
 * Declaration helper macro to construct apr_foo_pool_get()s.
 *
 * This standardized macro is used by opaque (APR) data types to return
 * the apr_pool_t that is associated with the data type.
 *
 * APR_POOL_DECLARE_ACCESSOR() is used in a header file to declare the
 * accessor function. A typical usage and result would be:
 * <pre>
 *    APR_POOL_DECLARE_ACCESSOR(file);
 * becomes:
 *    APR_DECLARE(apr_pool_t *) apr_file_pool_get(const apr_file_t *thefile);
 * </pre>
 * @remark Doxygen unwraps this macro (via doxygen.conf) to provide 
 * actual help for each specific occurrence of apr_foo_pool_get.
 * @remark the linkage is specified for APR. It would be possible to expand
 *       the macros to support other linkages.
 */
#define APR_POOL_DECLARE_ACCESSOR(type) \
    APR_DECLARE(apr_pool_t *) apr_##type##_pool_get \
        (const apr_##type##_t *the##type)

/** 
 * Implementation helper macro to provide apr_foo_pool_get()s.
 *
 * In the implementation, the APR_POOL_IMPLEMENT_ACCESSOR() is used to
 * actually define the function. It assumes the field is named "pool".
 */
#define APR_POOL_IMPLEMENT_ACCESSOR(type) \
    APR_DECLARE(apr_pool_t *) apr_##type##_pool_get \
            (const apr_##type##_t *the##type) \
        { return the##type->pool; }


/**
 * Pool debug levels
 *
 * <pre>
 * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
 * ---------------------------------
 * |   |   |   |   |   |   |   | x |  General debug code enabled (useful in
 *                                    combination with --with-efence).
 *
 * |   |   |   |   |   |   | x |   |  Verbose output on stderr (report
 *                                    CREATE, CLEAR, DESTROY).
 *
 * |   |   |   | x |   |   |   |   |  Verbose output on stderr (report
 *                                    PALLOC, PCALLOC).
 *
 * |   |   |   |   |   | x |   |   |  Lifetime checking. On each use of a
 *                                    pool, check its lifetime.  If the pool
 *                                    is out of scope, abort().
 *                                    In combination with the verbose flag
 *                                    above, it will output LIFE in such an
 *                                    event prior to aborting.
 *
 * |   |   |   |   | x |   |   |   |  Pool owner checking.  On each use of a
 *                                    pool, check if the current thread is the
 *                                    pool's owner.  If not, abort().  In
 *                                    combination with the verbose flag above,
 *                                    it will output OWNER in such an event
 *                                    prior to aborting.  Use the debug
 *                                    function apr_pool_owner_set() to switch
 *                                    a pool's ownership.
 *
 * When no debug level was specified, assume general debug mode.
 * If level 0 was specified, debugging is switched off.
 * </pre>
 */
#if defined(APR_POOL_DEBUG)
/* If APR_POOL_DEBUG is blank, we get 1; if it is a number, we get -1. */
#if (APR_POOL_DEBUG - APR_POOL_DEBUG -1 == 1)
#undef APR_POOL_DEBUG
#define APR_POOL_DEBUG 1
#endif
#else
#define APR_POOL_DEBUG 0
#endif

/** the place in the code where the particular function was called */
#define APR_POOL__FILE_LINE__ __FILE__ ":" APR_STRINGIFY(__LINE__)



/** A function that is called when allocation fails. */
typedef int (*apr_abortfunc_t)(int retcode);

/*
 * APR memory structure manipulators (pools, tables, and arrays).
 */

/*
 * Initialization
 */

/**
 * Setup all of the internal structures required to use pools
 * @remark Programs do NOT need to call this directly.  APR will call this
 *      automatically from apr_initialize.
 * @internal
 */
APR_DECLARE(apr_status_t) apr_pool_initialize(void);

/**
 * Tear down all of the internal structures required to use pools
 * @remark Programs do NOT need to call this directly.  APR will call this
 *      automatically from apr_terminate.
 * @internal
 */
APR_DECLARE(void) apr_pool_terminate(void);


/*
 * Pool creation/destruction
 */

#include "apr_allocator.h"

/**
 * Create a new pool.
 * @param newpool The pool we have just created.
 * @param parent The parent pool.  If this is NULL, the new pool is a root
 *        pool.  If it is non-NULL, the new pool will inherit all
 *        of its parent pool's attributes, except the apr_pool_t will
 *        be a sub-pool.
 * @param abort_fn A function to use if the pool cannot allocate more memory.
 * @param allocator The allocator to use with the new pool.  If NULL the
 *        allocator of the parent pool will be used.
 * @remark This function is thread-safe, in the sense that multiple threads
 *         can safely create subpools of the same parent pool concurrently.
 *         Similarly, a subpool can be created by one thread at the same
 *         time that another thread accesses the parent pool.
 */
APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool,
                                             apr_pool_t *parent,
                                             apr_abortfunc_t abort_fn,
                                             apr_allocator_t *allocator)
                          __attribute__((nonnull(1)));

/**
 * Create a new pool.
 * @deprecated @see apr_pool_create_unmanaged_ex.
 */
APR_DECLARE(apr_status_t) apr_pool_create_core_ex(apr_pool_t **newpool,
                                                  apr_abortfunc_t abort_fn,
                                                  apr_allocator_t *allocator);

/**
 * Create a new unmanaged pool.
 * @param newpool The pool we have just created.
 * @param abort_fn A function to use if the pool cannot allocate more memory.
 * @param allocator The allocator to use with the new pool.  If NULL a
 *        new allocator will be created with the new pool as owner.
 * @remark An unmanaged pool is a special pool without a parent; it will
 *         NOT be destroyed upon apr_terminate.  It must be explicitly
 *         destroyed by calling apr_pool_destroy, to prevent memory leaks.
 *         Use of this function is discouraged, think twice about whether
 *         you really really need it.
 * @warning Any child cleanups registered against the new pool, or
 *         against sub-pools thereof, will not be executed during an
 *         invocation of apr_proc_create(), so resources created in an
 *         "unmanaged" pool hierarchy will leak to child processes.
 */
APR_DECLARE(apr_status_t) apr_pool_create_unmanaged_ex(apr_pool_t **newpool,
                                                   apr_abortfunc_t abort_fn,
                                                   apr_allocator_t *allocator)
                          __attribute__((nonnull(1)));

/**
 * Debug version of apr_pool_create_ex.
 * @param newpool @see apr_pool_create.
 * @param parent @see apr_pool_create.
 * @param abort_fn @see apr_pool_create.
 * @param allocator @see apr_pool_create.
 * @param file_line Where the function is called from.
 *        This is usually APR_POOL__FILE_LINE__.
 * @remark Only available when APR_POOL_DEBUG is defined.
 *         Call this directly if you have your apr_pool_create_ex
 *         calls in a wrapper function and wish to override
 *         the file_line argument to reflect the caller of
 *         your wrapper function.  If you do not have
 *         apr_pool_create_ex in a wrapper, trust the macro
 *         and don't call apr_pool_create_ex_debug directly.
 */
APR_DECLARE(apr_status_t) apr_pool_create_ex_debug(apr_pool_t **newpool,
                                                   apr_pool_t *parent,
                                                   apr_abortfunc_t abort_fn,
                                                   apr_allocator_t *allocator,
                                                   const char *file_line)
                          __attribute__((nonnull(1)));

#if APR_POOL_DEBUG
#define apr_pool_create_ex(newpool, parent, abort_fn, allocator)  \
    apr_pool_create_ex_debug(newpool, parent, abort_fn, allocator, \
                             APR_POOL__FILE_LINE__)
#endif

/**
 * Debug version of apr_pool_create_core_ex.
 * @deprecated @see apr_pool_create_unmanaged_ex_debug.
 */
APR_DECLARE(apr_status_t) apr_pool_create_core_ex_debug(apr_pool_t **newpool,
                                                   apr_abortfunc_t abort_fn,
                                                   apr_allocator_t *allocator,
                                                   const char *file_line);

/**
 * Debug version of apr_pool_create_unmanaged_ex.
 * @param newpool @see apr_pool_create_unmanaged.
 * @param abort_fn @see apr_pool_create_unmanaged.
 * @param allocator @see apr_pool_create_unmanaged.
 * @param file_line Where the function is called from.
 *        This is usually APR_POOL__FILE_LINE__.
 * @remark Only available when APR_POOL_DEBUG is defined.
 *         Call this directly if you have your apr_pool_create_unmanaged_ex
 *         calls in a wrapper function and wish to override
 *         the file_line argument to reflect the caller of
 *         your wrapper function.  If you do not have
 *         apr_pool_create_core_ex in a wrapper, trust the macro
 *         and don't call apr_pool_create_core_ex_debug directly.
 */
APR_DECLARE(apr_status_t) apr_pool_create_unmanaged_ex_debug(apr_pool_t **newpool,
                                                   apr_abortfunc_t abort_fn,
                                                   apr_allocator_t *allocator,
                                                   const char *file_line)
                          __attribute__((nonnull(1)));

#if APR_POOL_DEBUG
#define apr_pool_create_core_ex(newpool, abort_fn, allocator)  \
    apr_pool_create_unmanaged_ex_debug(newpool, abort_fn, allocator, \
                                  APR_POOL__FILE_LINE__)

#define apr_pool_create_unmanaged_ex(newpool, abort_fn, allocator)  \
    apr_pool_create_unmanaged_ex_debug(newpool, abort_fn, allocator, \
                                  APR_POOL__FILE_LINE__)

#endif

/**
 * Create a new pool.
 * @param newpool The pool we have just created.
 * @param parent The parent pool.  If this is NULL, the new pool is a root
 *        pool.  If it is non-NULL, the new pool will inherit all
 *        of its parent pool's attributes, except the apr_pool_t will
 *        be a sub-pool.
 * @remark This function is thread-safe, in the sense that multiple threads
 *         can safely create subpools of the same parent pool concurrently.
 *         Similarly, a subpool can be created by one thread at the same
 *         time that another thread accesses the parent pool.
 */
#if defined(DOXYGEN)
APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool,
                                          apr_pool_t *parent);
#else
#if APR_POOL_DEBUG
#define apr_pool_create(newpool, parent) \
    apr_pool_create_ex_debug(newpool, parent, NULL, NULL, \
                             APR_POOL__FILE_LINE__)
#else
#define apr_pool_create(newpool, parent) \
    apr_pool_create_ex(newpool, parent, NULL, NULL)
#endif
#endif

/**
 * Create a new unmanaged pool.
 * @param newpool The pool we have just created.
 */
#if defined(DOXYGEN)
APR_DECLARE(apr_status_t) apr_pool_create_core(apr_pool_t **newpool);
APR_DECLARE(apr_status_t) apr_pool_create_unmanaged(apr_pool_t **newpool);
#else
#if APR_POOL_DEBUG
#define apr_pool_create_core(newpool) \
    apr_pool_create_unmanaged_ex_debug(newpool, NULL, NULL, \
                                  APR_POOL__FILE_LINE__)
#define apr_pool_create_unmanaged(newpool) \
    apr_pool_create_unmanaged_ex_debug(newpool, NULL, NULL, \
                                  APR_POOL__FILE_LINE__)
#else
#define apr_pool_create_core(newpool) \
    apr_pool_create_unmanaged_ex(newpool, NULL, NULL)
#define apr_pool_create_unmanaged(newpool) \
    apr_pool_create_unmanaged_ex(newpool, NULL, NULL)
#endif
#endif

/**
 * Find the pool's allocator
 * @param pool The pool to get the allocator from.
 */
APR_DECLARE(apr_allocator_t *) apr_pool_allocator_get(apr_pool_t *pool)
                               __attribute__((nonnull(1)));

/**
 * Clear all memory in the pool and run all the cleanups. This also destroys all
 * subpools.
 * @param p The pool to clear
 * @remark This does not actually free the memory, it just allows the pool
 *         to re-use this memory for the next allocation.
 * @see apr_pool_destroy()
 */
APR_DECLARE(void) apr_pool_clear(apr_pool_t *p) __attribute__((nonnull(1)));

/**
 * Debug version of apr_pool_clear.
 * @param p See: apr_pool_clear.
 * @param file_line Where the function is called from.
 *        This is usually APR_POOL__FILE_LINE__.
 * @remark Only available when APR_POOL_DEBUG is defined.
 *         Call this directly if you have your apr_pool_clear
 *         calls in a wrapper function and wish to override
 *         the file_line argument to reflect the caller of
 *         your wrapper function.  If you do not have
 *         apr_pool_clear in a wrapper, trust the macro
 *         and don't call apr_pool_destroy_clear directly.
 */
APR_DECLARE(void) apr_pool_clear_debug(apr_pool_t *p,
                                       const char *file_line)
                  __attribute__((nonnull(1)));

#if APR_POOL_DEBUG
#define apr_pool_clear(p) \
    apr_pool_clear_debug(p, APR_POOL__FILE_LINE__)
#endif

/**
 * Destroy the pool. This takes similar action as apr_pool_clear() and then
 * frees all the memory.
 * @param p The pool to destroy
 * @remark This will actually free the memory
 */
APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p) __attribute__((nonnull(1)));

/**
 * Debug version of apr_pool_destroy.
 * @param p See: apr_pool_destroy.
 * @param file_line Where the function is called from.
 *        This is usually APR_POOL__FILE_LINE__.
 * @remark Only available when APR_POOL_DEBUG is defined.
 *         Call this directly if you have your apr_pool_destroy
 *         calls in a wrapper function and wish to override
 *         the file_line argument to reflect the caller of
 *         your wrapper function.  If you do not have
 *         apr_pool_destroy in a wrapper, trust the macro
 *         and don't call apr_pool_destroy_debug directly.
 */
APR_DECLARE(void) apr_pool_destroy_debug(apr_pool_t *p,
                                         const char *file_line)
                  __attribute__((nonnull(1)));

#if APR_POOL_DEBUG
#define apr_pool_destroy(p) \
    apr_pool_destroy_debug(p, APR_POOL__FILE_LINE__)
#endif


/*
 * Memory allocation
 */

/**
 * Allocate a block of memory from a pool
 * @param p The pool to allocate from
 * @param size The amount of memory to allocate
 * @return The allocated memory
 */
APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size)
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
                    __attribute__((alloc_size(2)))
#endif
                    __attribute__((nonnull(1)));

/**
 * Debug version of apr_palloc
 * @param p See: apr_palloc
 * @param size See: apr_palloc
 * @param file_line Where the function is called from.
 *        This is usually APR_POOL__FILE_LINE__.
 * @return See: apr_palloc
 */
APR_DECLARE(void *) apr_palloc_debug(apr_pool_t *p, apr_size_t size,
                                     const char *file_line)
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
                    __attribute__((alloc_size(2)))
#endif
                    __attribute__((nonnull(1)));

#if APR_POOL_DEBUG
#define apr_palloc(p, size) \
    apr_palloc_debug(p, size, APR_POOL__FILE_LINE__)
#endif

/**
 * Allocate a block of memory from a pool and set all of the memory to 0
 * @param p The pool to allocate from
 * @param size The amount of memory to allocate
 * @return The allocated memory
 */
#if defined(DOXYGEN)
APR_DECLARE(void *) apr_pcalloc(apr_pool_t *p, apr_size_t size);
#elif !APR_POOL_DEBUG
#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
#endif

/**
 * Debug version of apr_pcalloc
 * @param p See: apr_pcalloc
 * @param size See: apr_pcalloc
 * @param file_line Where the function is called from.
 *        This is usually APR_POOL__FILE_LINE__.
 * @return See: apr_pcalloc
 */
APR_DECLARE(void *) apr_pcalloc_debug(apr_pool_t *p, apr_size_t size,
                                      const char *file_line)
                    __attribute__((nonnull(1)));

#if APR_POOL_DEBUG
#define apr_pcalloc(p, size) \
    apr_pcalloc_debug(p, size, APR_POOL__FILE_LINE__)
#endif


/*
 * Pool Properties
 */

/**
 * Set the function to be called when an allocation failure occurs.
 * @remark If the program wants APR to exit on a memory allocation error,
 *      then this function can be called to set the callback to use (for
 *      performing cleanup and then exiting). If this function is not called,
 *      then APR will return an error and expect the calling program to
 *      deal with the error accordingly.
 */
APR_DECLARE(void) apr_pool_abort_set(apr_abortfunc_t abortfunc,
                                     apr_pool_t *pool)
                  __attribute__((nonnull(2)));

/**
 * Get the abort function associated with the specified pool.
 * @param pool The pool for retrieving the abort function.
 * @return The abort function for the given pool.
 */
APR_DECLARE(apr_abortfunc_t) apr_pool_abort_get(apr_pool_t *pool)
                             __attribute__((nonnull(1)));

/**
 * Get the parent pool of the specified pool.
 * @param pool The pool for retrieving the parent pool.
 * @return The parent of the given pool.
 */
APR_DECLARE(apr_pool_t *) apr_pool_parent_get(apr_pool_t *pool)
                          __attribute__((nonnull(1)));

/**
 * Determine if pool a is an ancestor of pool b.
 * @param a The pool to search
 * @param b The pool to search for
 * @return True if a is an ancestor of b, NULL is considered an ancestor
 *         of all pools.
 * @remark if compiled with APR_POOL_DEBUG, this function will also
 * return true if A is a pool which has been guaranteed by the caller
 * (using apr_pool_join) to have a lifetime at least as long as some
 * ancestor of pool B.
 */
APR_DECLARE(int) apr_pool_is_ancestor(apr_pool_t *a, apr_pool_t *b);

/**
 * Tag a pool (give it a name)
 * @param pool The pool to tag
 * @param tag  The tag
 */
APR_DECLARE(void) apr_pool_tag(apr_pool_t *pool, const char *tag)
                  __attribute__((nonnull(1)));


/*
 * User data management
 */

/**
 * Set the data associated with the current pool
 * @param data The user data associated with the pool.
 * @param key The key to use for association
 * @param cleanup The cleanup program to use to cleanup the data (NULL if none)
 * @param pool The current pool
 * @warning The data to be attached to the pool should have a life span
 *          at least as long as the pool it is being attached to.
 *
 *      Users of APR must take EXTREME care when choosing a key to
 *      use for their data.  It is possible to accidentally overwrite
 *      data by choosing a key that another part of the program is using.
 *      Therefore it is advised that steps are taken to ensure that unique
 *      keys are used for all of the userdata objects in a particular pool
 *      (the same key in two different pools or a pool and one of its
 *      subpools is okay) at all times.  Careful namespace prefixing of
 *      key names is a typical way to help ensure this uniqueness.
 *
 */
APR_DECLARE(apr_status_t) apr_pool_userdata_set(const void *data,
                                                const char *key,
                                                apr_status_t (*cleanup)(void *),
                                                apr_pool_t *pool)
                          __attribute__((nonnull(2,4)));

/**
 * Set the data associated with the current pool
 * @param data The user data associated with the pool.
 * @param key The key to use for association
 * @param cleanup The cleanup program to use to cleanup the data (NULL if none)
 * @param pool The current pool
 * @note same as apr_pool_userdata_set(), except that this version doesn't
 *       make a copy of the key (this function is useful, for example, when
 *       the key is a string literal)
 * @warning This should NOT be used if the key could change addresses by
 *       any means between the apr_pool_userdata_setn() call and a
 *       subsequent apr_pool_userdata_get() on that key, such as if a
 *       static string is used as a userdata key in a DSO and the DSO could
 *       be unloaded and reloaded between the _setn() and the _get().  You
 *       MUST use apr_pool_userdata_set() in such cases.
 * @warning More generally, the key and the data to be attached to the
 *       pool should have a life span at least as long as the pool itself.
 *
 */
APR_DECLARE(apr_status_t) apr_pool_userdata_setn(
                                const void *data, const char *key,
                                apr_status_t (*cleanup)(void *),
                                apr_pool_t *pool)
                          __attribute__((nonnull(2,4)));

/**
 * Return the data associated with the current pool.
 * @param data The user data associated with the pool.
 * @param key The key for the data to retrieve
 * @param pool The current pool.
 */
APR_DECLARE(apr_status_t) apr_pool_userdata_get(void **data, const char *key,
                                                apr_pool_t *pool)
                          __attribute__((nonnull(1,2,3)));


/**
 * @defgroup PoolCleanup  Pool Cleanup Functions
 *
 * Cleanups are performed in the reverse order they were registered.  That is:
 * Last In, First Out.  A cleanup function can safely allocate memory from
 * the pool that is being cleaned up. It can also safely register additional
 * cleanups which will be run LIFO, directly after the current cleanup
 * terminates.  Cleanups have to take caution in calling functions that
 * create subpools. Subpools, created during cleanup will NOT automatically
 * be cleaned up.  In other words, cleanups are to clean up after themselves.
 *
 * @{
 */

/**
 * Register a function to be called when a pool is cleared or destroyed
 * @param p The pool to register the cleanup with
 * @param data The data to pass to the cleanup function.
 * @param plain_cleanup The function to call when the pool is cleared
 *                      or destroyed
 * @param child_cleanup The function to call when a child process is about
 *                      to exec - this function is called in the child, obviously!
 */
APR_DECLARE(void) apr_pool_cleanup_register(
                            apr_pool_t *p, const void *data,
                            apr_status_t (*plain_cleanup)(void *),
                            apr_status_t (*child_cleanup)(void *))
                  __attribute__((nonnull(3,4)));

/**
 * Register a function to be called when a pool is cleared or destroyed.
 *
 * Unlike apr_pool_cleanup_register which registers a cleanup
 * that is called AFTER all subpools are destroyed, this function registers
 * a function that will be called before any of the subpools are destroyed.
 *
 * @param p The pool to register the cleanup with
 * @param data The data to pass to the cleanup function.
 * @param plain_cleanup The function to call when the pool is cleared
 *                      or destroyed
 */
APR_DECLARE(void) apr_pool_pre_cleanup_register(
                            apr_pool_t *p, const void *data,
                            apr_status_t (*plain_cleanup)(void *))
                  __attribute__((nonnull(3)));

/**
 * Remove a previously registered cleanup function.
 * 
 * The cleanup most recently registered with @a p having the same values of
 * @a data and @a cleanup will be removed.
 *
 * @param p The pool to remove the cleanup from
 * @param data The data of the registered cleanup
 * @param cleanup The function to remove from cleanup
 * @remarks For some strange reason only the plain_cleanup is handled by this
 *          function
 */
APR_DECLARE(void) apr_pool_cleanup_kill(apr_pool_t *p, const void *data,
                                        apr_status_t (*cleanup)(void *))
                  __attribute__((nonnull(3)));

/**
 * Replace the child cleanup function of a previously registered cleanup.
 * 
 * The cleanup most recently registered with @a p having the same values of
 * @a data and @a plain_cleanup will have the registered child cleanup
 * function replaced with @a child_cleanup.
 *
 * @param p The pool of the registered cleanup
 * @param data The data of the registered cleanup
 * @param plain_cleanup The plain cleanup function of the registered cleanup
 * @param child_cleanup The function to register as the child cleanup
 */
APR_DECLARE(void) apr_pool_child_cleanup_set(
                        apr_pool_t *p, const void *data,
                        apr_status_t (*plain_cleanup)(void *),
                        apr_status_t (*child_cleanup)(void *))
                  __attribute__((nonnull(3,4)));

/**
 * Run the specified cleanup function immediately and unregister it.
 *
 * The cleanup most recently registered with @a p having the same values of
 * @a data and @a cleanup will be removed and @a cleanup will be called
 * with @a data as the argument.
 *
 * @param p The pool to remove the cleanup from
 * @param data The data to remove from cleanup
 * @param cleanup The function to remove from cleanup
 */
APR_DECLARE(apr_status_t) apr_pool_cleanup_run(apr_pool_t *p, void *data,
                                               apr_status_t (*cleanup)(void *))
                          __attribute__((nonnull(3)));

/**
 * An empty cleanup function.
 * 
 * Passed to apr_pool_cleanup_register() when no cleanup is required.
 *
 * @param data The data to cleanup, will not be used by this function.
 */
APR_DECLARE_NONSTD(apr_status_t) apr_pool_cleanup_null(void *data);

/**
 * Run all registered child cleanups, in preparation for an exec()
 * call in a forked child -- close files, etc., but *don't* flush I/O
 * buffers, *don't* wait for subprocesses, and *don't* free any
 * memory.
 */
APR_DECLARE(void) apr_pool_cleanup_for_exec(void);

/** @} */

/**
 * @defgroup PoolDebug Pool Debugging functions
 *
 * pools have nested lifetimes -- sub_pools are destroyed when the
 * parent pool is cleared.  We allow certain liberties with operations
 * on things such as tables (and on other structures in a more general
 * sense) where we allow the caller to insert values into a table which
 * were not allocated from the table's pool.  The table's data will
 * remain valid as long as all the pools from which its values are
 * allocated remain valid.
 *
 * For example, if B is a sub pool of A, and you build a table T in
 * pool B, then it's safe to insert data allocated in A or B into T
 * (because B lives at most as long as A does, and T is destroyed when
 * B is cleared/destroyed).  On the other hand, if S is a table in
 * pool A, it is safe to insert data allocated in A into S, but it
 * is *not safe* to insert data allocated from B into S... because
 * B can be cleared/destroyed before A is (which would leave dangling
 * pointers in T's data structures).
 *
 * In general we say that it is safe to insert data into a table T
 * if the data is allocated in any ancestor of T's pool.  This is the
 * basis on which the APR_POOL_DEBUG code works -- it tests these ancestor
 * relationships for all data inserted into tables.  APR_POOL_DEBUG also
 * provides tools (apr_pool_find, and apr_pool_is_ancestor) for other
 * folks to implement similar restrictions for their own data
 * structures.
 *
 * However, sometimes this ancestor requirement is inconvenient --
 * sometimes it's necessary to create a sub pool where the sub pool is
 * guaranteed to have the same lifetime as the parent pool.  This is a
 * guarantee implemented by the *caller*, not by the pool code.  That
 * is, the caller guarantees they won't destroy the sub pool
 * individually prior to destroying the parent pool.
 *
 * In this case the caller must call apr_pool_join() to indicate this
 * guarantee to the APR_POOL_DEBUG code.
 *
 * These functions are only implemented when #APR_POOL_DEBUG is set.
 *
 * @{
 */
#if APR_POOL_DEBUG || defined(DOXYGEN)
/**
 * Guarantee that a subpool has the same lifetime as the parent.
 * @param p The parent pool
 * @param sub The subpool
 */
APR_DECLARE(void) apr_pool_join(apr_pool_t *p, apr_pool_t *sub)
                  __attribute__((nonnull(2)));

/**
 * Find a pool from something allocated in it.
 * @param mem The thing allocated in the pool
 * @return The pool it is allocated in
 */
APR_DECLARE(apr_pool_t *) apr_pool_find(const void *mem);

/**
 * Report the number of bytes currently in the pool
 * @param p The pool to inspect
 * @param recurse Recurse/include the subpools' sizes
 * @return The number of bytes
 */
APR_DECLARE(apr_size_t) apr_pool_num_bytes(apr_pool_t *p, int recurse)
                        __attribute__((nonnull(1)));

/**
 * Lock a pool
 * @param pool The pool to lock
 * @param flag  The flag
 */
APR_DECLARE(void) apr_pool_lock(apr_pool_t *pool, int flag);

/** @} */

#else /* APR_POOL_DEBUG or DOXYGEN */

#ifdef apr_pool_join
#undef apr_pool_join
#endif
#define apr_pool_join(a,b)

#ifdef apr_pool_lock
#undef apr_pool_lock
#endif
#define apr_pool_lock(pool, lock)

#endif /* APR_POOL_DEBUG or DOXYGEN */

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* !APR_POOLS_H */
include/apr-1/apr_time.h000064400000016613150336140420011065 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_TIME_H
#define APR_TIME_H

/**
 * @file apr_time.h
 * @brief APR Time Library
 */

#include "apr.h"
#include "apr_errno.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_time Time Routines
 * @ingroup APR 
 * @{
 */

/** month names */
APR_DECLARE_DATA extern const char apr_month_snames[12][4];
/** day names */
APR_DECLARE_DATA extern const char apr_day_snames[7][4];


/** number of microseconds since 00:00:00 January 1, 1970 UTC */
typedef apr_int64_t apr_time_t;


/** mechanism to properly type apr_time_t literals */
#define APR_TIME_C(val) APR_INT64_C(val)

/** mechanism to properly print apr_time_t values */
#define APR_TIME_T_FMT APR_INT64_T_FMT

/** intervals for I/O timeouts, in microseconds */
typedef apr_int64_t apr_interval_time_t;
/** short interval for I/O timeouts, in microseconds */
typedef apr_int32_t apr_short_interval_time_t;

/** number of microseconds per second */
#define APR_USEC_PER_SEC APR_TIME_C(1000000)

/** @return apr_time_t as a second */
#define apr_time_sec(time) ((time) / APR_USEC_PER_SEC)

/** @return apr_time_t as a usec */
#define apr_time_usec(time) ((time) % APR_USEC_PER_SEC)

/** @return apr_time_t as a msec */
#define apr_time_msec(time) (((time) / 1000) % 1000)

/** @return apr_time_t as a msec */
#define apr_time_as_msec(time) ((time) / 1000)

/** @return milliseconds as an apr_time_t */
#define apr_time_from_msec(msec) ((apr_time_t)(msec) * 1000)

/** @return seconds as an apr_time_t */
#define apr_time_from_sec(sec) ((apr_time_t)(sec) * APR_USEC_PER_SEC)

/** @return a second and usec combination as an apr_time_t */
#define apr_time_make(sec, usec) ((apr_time_t)(sec) * APR_USEC_PER_SEC \
                                + (apr_time_t)(usec))

/**
 * @return the current time
 */
APR_DECLARE(apr_time_t) apr_time_now(void);

/** @see apr_time_exp_t */
typedef struct apr_time_exp_t apr_time_exp_t;

/**
 * a structure similar to ANSI struct tm with the following differences:
 *  - tm_usec isn't an ANSI field
 *  - tm_gmtoff isn't an ANSI field (it's a BSDism)
 */
struct apr_time_exp_t {
    /** microseconds past tm_sec */
    apr_int32_t tm_usec;
    /** (0-61) seconds past tm_min */
    apr_int32_t tm_sec;
    /** (0-59) minutes past tm_hour */
    apr_int32_t tm_min;
    /** (0-23) hours past midnight */
    apr_int32_t tm_hour;
    /** (1-31) day of the month */
    apr_int32_t tm_mday;
    /** (0-11) month of the year */
    apr_int32_t tm_mon;
    /** year since 1900 */
    apr_int32_t tm_year;
    /** (0-6) days since Sunday */
    apr_int32_t tm_wday;
    /** (0-365) days since January 1 */
    apr_int32_t tm_yday;
    /** daylight saving time */
    apr_int32_t tm_isdst;
    /** seconds east of UTC */
    apr_int32_t tm_gmtoff;
};

/* Delayed the include to avoid a circular reference */
#include "apr_pools.h"

/**
 * Convert an ansi time_t to an apr_time_t
 * @param result the resulting apr_time_t
 * @param input the time_t to convert
 */
APR_DECLARE(apr_status_t) apr_time_ansi_put(apr_time_t *result, 
                                                    time_t input);

/**
 * Convert a time to its human readable components using an offset
 * from GMT.
 * @param result the exploded time
 * @param input the time to explode
 * @param offs the number of seconds offset to apply
 */
APR_DECLARE(apr_status_t) apr_time_exp_tz(apr_time_exp_t *result,
                                          apr_time_t input,
                                          apr_int32_t offs);

/**
 * Convert a time to its human readable components (GMT).
 * @param result the exploded time
 * @param input the time to explode
 */
APR_DECLARE(apr_status_t) apr_time_exp_gmt(apr_time_exp_t *result, 
                                           apr_time_t input);

/**
 * Convert a time to its human readable components in the local timezone.
 * @param result the exploded time
 * @param input the time to explode
 */
APR_DECLARE(apr_status_t) apr_time_exp_lt(apr_time_exp_t *result, 
                                          apr_time_t input);

/**
 * Convert time value from human readable format to a numeric apr_time_t
 * (elapsed microseconds since the epoch).
 * @param result the resulting imploded time
 * @param input the input exploded time
 */
APR_DECLARE(apr_status_t) apr_time_exp_get(apr_time_t *result, 
                                           apr_time_exp_t *input);

/**
 * Convert time value from human readable format to a numeric apr_time_t that
 * always represents GMT.
 * @param result the resulting imploded time
 * @param input the input exploded time
 */
APR_DECLARE(apr_status_t) apr_time_exp_gmt_get(apr_time_t *result, 
                                               apr_time_exp_t *input);

/**
 * Sleep for the specified number of micro-seconds.
 * @param t desired amount of time to sleep.
 * @warning May sleep for longer than the specified time. 
 */
APR_DECLARE(void) apr_sleep(apr_interval_time_t t);

/** length of a RFC822 Date */
#define APR_RFC822_DATE_LEN (30)
/**
 * apr_rfc822_date formats dates in the RFC822
 * format in an efficient manner.  It is a fixed length
 * format which requires APR_RFC822_DATA_LEN bytes of storage,
 * including the trailing NUL terminator.
 * @param date_str String to write to.
 * @param t the time to convert 
 */
APR_DECLARE(apr_status_t) apr_rfc822_date(char *date_str, apr_time_t t);

/** length of a CTIME date */
#define APR_CTIME_LEN (25)
/**
 * apr_ctime formats dates in the ctime() format
 * in an efficient manner.  It is a fixed length format
 * and requires APR_CTIME_LEN bytes of storage including
 * the trailing NUL terminator.
 * Unlike ANSI/ISO C ctime(), apr_ctime() does not include
 * a \\n at the end of the string.
 * @param date_str String to write to.
 * @param t the time to convert 
 */
APR_DECLARE(apr_status_t) apr_ctime(char *date_str, apr_time_t t);

/**
 * Formats the exploded time according to the format specified
 * @param s string to write to
 * @param retsize The length of the returned string
 * @param max The maximum length of the string
 * @param format The format for the time string
 * @param tm The time to convert
 */
APR_DECLARE(apr_status_t) apr_strftime(char *s, apr_size_t *retsize, 
                                       apr_size_t max, const char *format, 
                                       apr_time_exp_t *tm);

/**
 * Improve the clock resolution for the lifetime of the given pool.
 * Generally this is only desirable on benchmarking and other very
 * time-sensitive applications, and has no impact on most platforms.
 * @param p The pool to associate the finer clock resolution 
 */
APR_DECLARE(void) apr_time_clock_hires(apr_pool_t *p);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_TIME_H */
include/apr-1/apr_hooks.h000064400000030564150336140420011253 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_HOOKS_H
#define APR_HOOKS_H

#include "apu.h"
/* For apr_array_header_t */
#include "apr_tables.h"

/**
 * @file apr_hooks.h
 * @brief Apache hook functions
 */

#ifdef __cplusplus
extern "C" {
#endif
/**
 * @defgroup APR_Util_Hook Hook Functions
 * @ingroup APR_Util
 * @{
 */

/**
 * @defgroup apr_hook_probes Hook probe capability
 * APR hooks provide a trace probe capability for capturing
 * the flow of control and return values with hooks.
 *
 * In order to use this facility, the application must define
 * the symbol APR_HOOK_PROBES_ENABLED and the four APR_HOOK_PROBE_
 * macros described below before including apr_hooks.h in files
 * that use the APR_IMPLEMENT_EXTERNAL_HOOK_* macros.
 *
 * This probe facility is not provided for APR optional hooks.
 * @{
 */

#ifdef APR_HOOK_PROBES_ENABLED
#define APR_HOOK_INT_DCL_UD void *ud = NULL
#else
/** internal implementation detail to avoid the ud declaration when
 * hook probes are not used
 */
#define APR_HOOK_INT_DCL_UD
/**
 * User-defined hook probe macro that is invoked when the hook
 * is run, before calling any hook functions.
 * @param ud A void * user data field that should be filled in by
 * this macro, and will be provided to the other hook probe macros.
 * @param ns The namespace prefix of the hook functions
 * @param name The name of the hook
 * @param args The argument list to the hook functions, with enclosing
 * parens.
 */
#define APR_HOOK_PROBE_ENTRY(ud,ns,name,args)
/**
 * User-defined hook probe macro that is invoked after the hook
 * has run.
 * @param ud A void * user data field that was filled in by the user-
 * provided APR_HOOK_PROBE_ENTRY().
 * @param ns The namespace prefix of the hook functions
 * @param name The name of the hook
 * @param rv The return value of the hook, or 0 if the hook is void.
 * @param args The argument list to the hook functions, with enclosing
 * parens.
 */
#define APR_HOOK_PROBE_RETURN(ud,ns,name,rv,args)
/**
 * User-defined hook probe macro that is invoked before calling a
 * hook function.
 * @param ud A void * user data field that was filled in by the user-
 * provided APR_HOOK_PROBE_ENTRY().
 * @param ns The namespace prefix of the hook functions
 * @param name The name of the hook
 * @param src The value of apr_hook_debug_current at the time the function
 * was hooked (usually the source file implementing the hook function).
 * @param args The argument list to the hook functions, with enclosing
 * parens.
 */
#define APR_HOOK_PROBE_INVOKE(ud,ns,name,src,args)
/**
 * User-defined hook probe macro that is invoked after calling a
 * hook function.
 * @param ud A void * user data field that was filled in by the user-
 * provided APR_HOOK_PROBE_ENTRY().
 * @param ns The namespace prefix of the hook functions
 * @param name The name of the hook
 * @param src The value of apr_hook_debug_current at the time the function
 * was hooked (usually the source file implementing the hook function).
 * @param rv The return value of the hook function, or 0 if the hook is void.
 * @param args The argument list to the hook functions, with enclosing
 * parens.
 */
#define APR_HOOK_PROBE_COMPLETE(ud,ns,name,src,rv,args)
#endif

/** @} */

/** macro to return the prototype of the hook function */    
#define APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
link##_DECLARE(apr_array_header_t *) ns##_hook_get_##name(void)

/** macro to declare the hook correctly */    
#define APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \
typedef ret ns##_HOOK_##name##_t args; \
link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \
                                      const char * const *aszPre, \
                                      const char * const *aszSucc, int nOrder); \
link##_DECLARE(ret) ns##_run_##name args; \
APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \
typedef struct ns##_LINK_##name##_t \
    { \
    ns##_HOOK_##name##_t *pFunc; \
    const char *szName; \
    const char * const *aszPredecessors; \
    const char * const *aszSuccessors; \
    int nOrder; \
    } ns##_LINK_##name##_t;

/** macro to declare the hook structure */    
#define APR_HOOK_STRUCT(members) \
static struct { members } _hooks;

/** macro to link the hook structure */
#define APR_HOOK_LINK(name) \
    apr_array_header_t *link_##name;

/** macro to implement the hook */
#define APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf,const char * const *aszPre, \
                                      const char * const *aszSucc,int nOrder) \
    { \
    ns##_LINK_##name##_t *pHook; \
    if(!_hooks.link_##name) \
	{ \
	_hooks.link_##name=apr_array_make(apr_hook_global_pool,1,sizeof(ns##_LINK_##name##_t)); \
	apr_hook_sort_register(#name,&_hooks.link_##name); \
	} \
    pHook=apr_array_push(_hooks.link_##name); \
    pHook->pFunc=pf; \
    pHook->aszPredecessors=aszPre; \
    pHook->aszSuccessors=aszSucc; \
    pHook->nOrder=nOrder; \
    pHook->szName=apr_hook_debug_current; \
    if(apr_hook_debug_enabled) \
	apr_hook_debug_show(#name,aszPre,aszSucc); \
    } \
    APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
    { \
        return _hooks.link_##name; \
    }

/**
 * Implement a hook that has no return code, and therefore runs all of the
 * registered functions
 * @param ns The namespace prefix of the hook functions
 * @param link The linkage declaration prefix of the hook
 * @param name The name of the hook
 * @param args_decl The declaration of the arguments for the hook
 * @param args_use The names for the arguments for the hook
 * @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
 * provide export linkage from the module that IMPLEMENTs the hook, and
 * import linkage from external modules that link to the hook's module.
 */
#define APR_IMPLEMENT_EXTERNAL_HOOK_VOID(ns,link,name,args_decl,args_use) \
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(void) ns##_run_##name args_decl \
    { \
    ns##_LINK_##name##_t *pHook; \
    int n; \
    APR_HOOK_INT_DCL_UD; \
\
    APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
\
    if(_hooks.link_##name) \
        { \
        pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
        for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
            { \
            APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
	    pHook[n].pFunc args_use; \
            APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, 0, args_use); \
            } \
        } \
\
    APR_HOOK_PROBE_RETURN(ud, ns, name, 0, args_use); \
\
    }

/* FIXME: note that this returns ok when nothing is run. I suspect it should
   really return decline, but that breaks Apache currently - Ben
*/
/**
 * Implement a hook that runs until one of the functions returns something
 * other than OK or DECLINE
 * @param ns The namespace prefix of the hook functions
 * @param link The linkage declaration prefix of the hook
 * @param ret Type to return
 * @param name The name of the hook
 * @param args_decl The declaration of the arguments for the hook
 * @param args_use The names for the arguments for the hook
 * @param ok Success value
 * @param decline Decline value
 * @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
 * provide export linkage from the module that IMPLEMENTs the hook, and
 * import linkage from external modules that link to the hook's module.
 */
#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(ret) ns##_run_##name args_decl \
    { \
    ns##_LINK_##name##_t *pHook; \
    int n; \
    ret rv = ok; \
    APR_HOOK_INT_DCL_UD; \
\
    APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
\
    if(_hooks.link_##name) \
        { \
        pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
        for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
            { \
            APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
            rv=pHook[n].pFunc args_use; \
            APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, rv, args_use); \
            if(rv != ok && rv != decline) \
                break; \
            rv = ok; \
            } \
        } \
\
    APR_HOOK_PROBE_RETURN(ud, ns, name, rv, args_use); \
\
    return rv; \
    }


/**
 * Implement a hook that runs until the first function returns something
 * other than the value of decline
 * @param ns The namespace prefix of the hook functions
 * @param link The linkage declaration prefix of the hook
 * @param name The name of the hook
 * @param ret Type to return
 * @param args_decl The declaration of the arguments for the hook
 * @param args_use The names for the arguments for the hook
 * @param decline Decline value
 * @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
 * provide export linkage from the module that IMPLEMENTs the hook, and
 * import linkage from external modules that link to the hook's module.
 */
#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(ns,link,ret,name,args_decl,args_use,decline) \
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(ret) ns##_run_##name args_decl \
    { \
    ns##_LINK_##name##_t *pHook; \
    int n; \
    ret rv = decline; \
    APR_HOOK_INT_DCL_UD; \
\
    APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
\
    if(_hooks.link_##name) \
        { \
        pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
        for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
            { \
            APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
            rv=pHook[n].pFunc args_use; \
            APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, rv, args_use); \
\
            if(rv != decline) \
                break; \
            } \
        } \
\
    APR_HOOK_PROBE_RETURN(ud, ns, name, rv, args_use); \
\
    return rv; \
    }

    /* Hook orderings */
/** run this hook first, before ANYTHING */
#define APR_HOOK_REALLY_FIRST	(-10)
/** run this hook first */
#define APR_HOOK_FIRST		0
/** run this hook somewhere */
#define APR_HOOK_MIDDLE		10
/** run this hook after every other hook which is defined*/
#define APR_HOOK_LAST		20
/** run this hook last, after EVERYTHING */
#define APR_HOOK_REALLY_LAST	30

/**
 * The global pool used to allocate any memory needed by the hooks.
 */ 
APU_DECLARE_DATA extern apr_pool_t *apr_hook_global_pool;

/**
 * A global variable to determine if debugging information about the
 * hooks functions should be printed.
 */ 
APU_DECLARE_DATA extern int apr_hook_debug_enabled;

/**
 * The name of the module that is currently registering a function.
 */ 
APU_DECLARE_DATA extern const char *apr_hook_debug_current;

/**
 * Register a hook function to be sorted.
 * @param szHookName The name of the Hook the function is registered for
 * @param aHooks The array which stores all of the functions for this hook
 */
APU_DECLARE(void) apr_hook_sort_register(const char *szHookName, 
                                        apr_array_header_t **aHooks);
/**
 * Sort all of the registered functions for a given hook.
 */
APU_DECLARE(void) apr_hook_sort_all(void);

/**
 * Print all of the information about the current hook.  This is used for
 * debugging purposes.
 * @param szName The name of the hook
 * @param aszPre All of the functions in the predecessor array
 * @param aszSucc All of the functions in the successor array
 */
APU_DECLARE(void) apr_hook_debug_show(const char *szName,
                                      const char * const *aszPre,
                                      const char * const *aszSucc);

/**
 * Remove all currently registered functions.
 */
APU_DECLARE(void) apr_hook_deregister_all(void);

/** @} */
#ifdef __cplusplus
}
#endif

#endif /* APR_HOOKS_H */
include/apr-1/apr_thread_mutex.h000064400000010622150336140420012612 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_THREAD_MUTEX_H
#define APR_THREAD_MUTEX_H

/**
 * @file apr_thread_mutex.h
 * @brief APR Thread Mutex Routines
 */

#include "apr.h"
#include "apr_errno.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#if APR_HAS_THREADS || defined(DOXYGEN)

/**
 * @defgroup apr_thread_mutex Thread Mutex Routines
 * @ingroup APR 
 * @{
 */

/** Opaque thread-local mutex structure */
typedef struct apr_thread_mutex_t apr_thread_mutex_t;

#define APR_THREAD_MUTEX_DEFAULT  0x0   /**< platform-optimal lock behavior */
#define APR_THREAD_MUTEX_NESTED   0x1   /**< enable nested (recursive) locks */
#define APR_THREAD_MUTEX_UNNESTED 0x2   /**< disable nested locks */
#define APR_THREAD_MUTEX_TIMED    0x4   /**< enable timed locks */

/* Delayed the include to avoid a circular reference */
#include "apr_pools.h"
#include "apr_time.h"

/**
 * Create and initialize a mutex that can be used to synchronize threads.
 * @param mutex the memory address where the newly created mutex will be
 *        stored.
 * @param flags Or'ed value of:
 * <PRE>
 *           APR_THREAD_MUTEX_DEFAULT   platform-optimal lock behavior.
 *           APR_THREAD_MUTEX_NESTED    enable nested (recursive) locks.
 *           APR_THREAD_MUTEX_UNNESTED  disable nested locks (non-recursive).
 * </PRE>
 * @param pool the pool from which to allocate the mutex.
 * @warning Be cautious in using APR_THREAD_MUTEX_DEFAULT.  While this is the
 * most optimal mutex based on a given platform's performance characteristics,
 * it will behave as either a nested or an unnested lock.
 */
APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex,
                                                  unsigned int flags,
                                                  apr_pool_t *pool);
/**
 * Acquire the lock for the given mutex. If the mutex is already locked,
 * the current thread will be put to sleep until the lock becomes available.
 * @param mutex the mutex on which to acquire the lock.
 */
APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex);

/**
 * Attempt to acquire the lock for the given mutex. If the mutex has already
 * been acquired, the call returns immediately with APR_EBUSY. Note: it
 * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine
 * if the return value was APR_EBUSY, for portability reasons.
 * @param mutex the mutex on which to attempt the lock acquiring.
 */
APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex);

/**
 * Attempt to acquire the lock for the given mutex until timeout expires.
 * If the acquisition time outs, the call returns with APR_TIMEUP.
 * @param mutex the mutex on which to attempt the lock acquiring.
 * @param timeout the relative timeout (microseconds).
 * @note A timeout negative or nul means immediate attempt, returning
 *       APR_TIMEUP without blocking if it the lock is already acquired.
 */
APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
                                                 apr_interval_time_t timeout);

/**
 * Release the lock for the given mutex.
 * @param mutex the mutex from which to release the lock.
 */
APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex);

/**
 * Destroy the mutex and free the memory associated with the lock.
 * @param mutex the mutex to destroy.
 */
APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex);

/**
 * Get the pool used by this thread_mutex.
 * @return apr_pool_t the pool
 */
APR_POOL_DECLARE_ACCESSOR(thread_mutex);

#endif /* APR_HAS_THREADS */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_THREAD_MUTEX_H */
include/apr-1/apr_strings.h000064400000035061150336140420011616 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* Portions of this file are covered by */
/* -*- mode: c; c-file-style: "k&r" -*-

  strnatcmp.c -- Perform 'natural order' comparisons of strings in C.
  Copyright (C) 2000 by Martin Pool <mbp@humbug.org.au>

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.
*/

#ifndef APR_STRINGS_H
#define APR_STRINGS_H

/**
 * @file apr_strings.h
 * @brief APR Strings library
 */

#include "apr.h"
#include "apr_errno.h"
#include "apr_pools.h"
#define APR_WANT_IOVEC
#include "apr_want.h"

#if APR_HAVE_STDARG_H
#include <stdarg.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_strings String routines
 * @ingroup APR 
 * @{
 */

/**
 * Do a natural order comparison of two strings.
 * @param a The first string to compare
 * @param b The second string to compare
 * @return Either <0, 0, or >0.  If the first string is less than the second
 *          this returns <0, if they are equivalent it returns 0, and if the
 *          first string is greater than second string it retuns >0.
 */
APR_DECLARE(int) apr_strnatcmp(char const *a, char const *b);

/**
 * Do a natural order comparison of two strings ignoring the case of the 
 * strings.
 * @param a The first string to compare
 * @param b The second string to compare
 * @return Either <0, 0, or >0.  If the first string is less than the second
 *         this returns <0, if they are equivalent it returns 0, and if the
 *         first string is greater than second string it retuns >0.
 */
APR_DECLARE(int) apr_strnatcasecmp(char const *a, char const *b);

/**
 * duplicate a string into memory allocated out of a pool
 * @param p The pool to allocate out of
 * @param s The string to duplicate
 * @return The new string or NULL if s == NULL
 */
APR_DECLARE(char *) apr_pstrdup(apr_pool_t *p, const char *s);

/**
 * Create a null-terminated string by making a copy of a sequence
 * of characters and appending a null byte
 * @param p The pool to allocate out of
 * @param s The block of characters to duplicate
 * @param n The number of characters to duplicate
 * @return The new string or NULL if s == NULL
 * @remark This is a faster alternative to apr_pstrndup(), for use
 *         when you know that the string being duplicated really
 *         has 'n' or more characters.  If the string might contain
 *         fewer characters, use apr_pstrndup().
 */
APR_DECLARE(char *) apr_pstrmemdup(apr_pool_t *p, const char *s, apr_size_t n)
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
    __attribute__((alloc_size(3)))
#endif
    ;

/**
 * Duplicate at most n characters of a string into memory allocated 
 * out of a pool; the new string will be NUL-terminated
 * @param p The pool to allocate out of
 * @param s The string to duplicate
 * @param n The maximum number of characters to duplicate
 * @return The new string or NULL if s == NULL
 * @remark The amount of memory allocated from the pool is the length
 *         of the returned string including the NUL terminator
 */
APR_DECLARE(char *) apr_pstrndup(apr_pool_t *p, const char *s, apr_size_t n);

/**
 * Duplicate a block of memory.
 *
 * @param p The pool to allocate from
 * @param m The memory to duplicate
 * @param n The number of bytes to duplicate
 * @return The new block of memory or NULL if m == NULL
 */
APR_DECLARE(void *) apr_pmemdup(apr_pool_t *p, const void *m, apr_size_t n)
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
    __attribute__((alloc_size(3)))
#endif
    ;

/**
 * Concatenate multiple strings, allocating memory out a pool
 * @param p The pool to allocate out of
 * @param ... The strings to concatenate.  The final string must be NULL
 * @return The new string
 */
APR_DECLARE_NONSTD(char *) apr_pstrcat(apr_pool_t *p, ...)
#if defined(__GNUC__) && __GNUC__ >= 4
    __attribute__((sentinel))
#endif
    ;

/**
 * Concatenate multiple strings specified in a writev-style vector
 * @param p The pool from which to allocate
 * @param vec The strings to concatenate
 * @param nvec The number of strings to concatenate
 * @param nbytes (output) strlen of new string (pass in NULL to omit)
 * @return The new string
 */
APR_DECLARE(char *) apr_pstrcatv(apr_pool_t *p, const struct iovec *vec,
                                 apr_size_t nvec, apr_size_t *nbytes);

/**
 * printf-style style printing routine.  The data is output to a string 
 * allocated from a pool
 * @param p The pool to allocate out of
 * @param fmt The format of the string
 * @param ap The arguments to use while printing the data
 * @return The new string
 */
APR_DECLARE(char *) apr_pvsprintf(apr_pool_t *p, const char *fmt, va_list ap);

/**
 * printf-style style printing routine.  The data is output to a string 
 * allocated from a pool
 * @param p The pool to allocate out of
 * @param fmt The format of the string
 * @param ... The arguments to use while printing the data
 * @return The new string
 */
APR_DECLARE_NONSTD(char *) apr_psprintf(apr_pool_t *p, const char *fmt, ...)
        __attribute__((format(printf,2,3)));

/**
 * Copy up to dst_size characters from src to dst; does not copy
 * past a NUL terminator in src, but always terminates dst with a NUL
 * regardless.
 * @param dst The destination string
 * @param src The source string
 * @param dst_size The space available in dst; dst always receives
 *                 NUL termination, so if src is longer than
 *                 dst_size, the actual number of characters copied is
 *                 dst_size - 1.
 * @return Pointer to the NUL terminator of the destination string, dst
 * @remark
 * <PRE>
 * Note the differences between this function and strncpy():
 *  1) strncpy() doesn't always NUL terminate; apr_cpystrn() does.
 *  2) strncpy() pads the destination string with NULs, which is often 
 *     unnecessary; apr_cpystrn() does not.
 *  3) strncpy() returns a pointer to the beginning of the dst string;
 *     apr_cpystrn() returns a pointer to the NUL terminator of dst, 
 *     to allow a check for truncation.
 * </PRE>
 */
APR_DECLARE(char *) apr_cpystrn(char *dst, const char *src,
                                apr_size_t dst_size);

/**
 * Remove all whitespace from a string
 * @param dest The destination string.  It is okay to modify the string
 *             in place.  Namely dest == src
 * @param src The string to rid the spaces from.
 * @return A pointer to the destination string's null terminator.
 */
APR_DECLARE(char *) apr_collapse_spaces(char *dest, const char *src);

/**
 * Convert the arguments to a program from one string to an array of 
 * strings terminated by a NULL pointer
 * @param arg_str The arguments to convert
 * @param argv_out Output location.  This is a pointer to an array of strings.
 * @param token_context Pool to use.
 */
APR_DECLARE(apr_status_t) apr_tokenize_to_argv(const char *arg_str,
                                               char ***argv_out,
                                               apr_pool_t *token_context);

/**
 * Split a string into separate null-terminated tokens.  The tokens are 
 * delimited in the string by one or more characters from the sep
 * argument.
 * @param str The string to separate; this should be specified on the
 *            first call to apr_strtok() for a given string, and NULL
 *            on subsequent calls.
 * @param sep The set of delimiters
 * @param last State saved by apr_strtok() between calls.
 * @return The next token from the string
 * @note the 'last' state points to the trailing NUL char of the final
 * token, otherwise it points to the character following the current
 * token (all successive or empty occurances of sep are skiped on the
 * subsequent call to apr_strtok).  Therefore it is possible to avoid
 * a strlen() determination, with the following logic;
 * toklen = last - retval; if (*last) --toklen;
 */
APR_DECLARE(char *) apr_strtok(char *str, const char *sep, char **last);

/**
 * @defgroup APR_Strings_Snprintf snprintf implementations
 * @warning
 * These are snprintf implementations based on apr_vformatter().
 *
 * Note that various standards and implementations disagree on the return
 * value of snprintf, and side-effects due to %n in the formatting string.
 * apr_snprintf (and apr_vsnprintf) behaves as follows:
 *
 * Process the format string until the entire string is exhausted, or
 * the buffer fills.  If the buffer fills then stop processing immediately
 * (so no further %n arguments are processed), and return the buffer
 * length.  In all cases the buffer is NUL terminated. It will return the
 * number of characters inserted into the buffer, not including the
 * terminating NUL. As a special case, if len is 0, apr_snprintf will
 * return the number of characters that would have been inserted if
 * the buffer had been infinite (in this case, *buffer can be NULL)
 *
 * In no event does apr_snprintf return a negative number.
 * @{
 */

/**
 * snprintf routine based on apr_vformatter.  This means it understands the
 * same extensions.
 * @param buf The buffer to write to
 * @param len The size of the buffer
 * @param format The format string
 * @param ... The arguments to use to fill out the format string.
 */
APR_DECLARE_NONSTD(int) apr_snprintf(char *buf, apr_size_t len,
                                     const char *format, ...)
        __attribute__((format(printf,3,4)));

/**
 * vsnprintf routine based on apr_vformatter.  This means it understands the
 * same extensions.
 * @param buf The buffer to write to
 * @param len The size of the buffer
 * @param format The format string
 * @param ap The arguments to use to fill out the format string.
 */
APR_DECLARE(int) apr_vsnprintf(char *buf, apr_size_t len, const char *format,
                               va_list ap);
/** @} */

/**
 * create a string representation of an int, allocated from a pool
 * @param p The pool from which to allocate
 * @param n The number to format
 * @return The string representation of the number
 */
APR_DECLARE(char *) apr_itoa(apr_pool_t *p, int n);

/**
 * create a string representation of a long, allocated from a pool
 * @param p The pool from which to allocate
 * @param n The number to format
 * @return The string representation of the number
 */
APR_DECLARE(char *) apr_ltoa(apr_pool_t *p, long n);

/**
 * create a string representation of an apr_off_t, allocated from a pool
 * @param p The pool from which to allocate
 * @param n The number to format
 * @return The string representation of the number
 */
APR_DECLARE(char *) apr_off_t_toa(apr_pool_t *p, apr_off_t n);

/**
 * Convert a numeric string into an apr_off_t numeric value.
 * @param offset The value of the parsed string.
 * @param buf The string to parse. It may contain optional whitespace,
 *   followed by an optional '+' (positive, default) or '-' (negative)
 *   character, followed by an optional '0x' prefix if base is 0 or 16,
 *   followed by numeric digits appropriate for base.
 * @param end A pointer to the end of the valid character in buf. If
 *   not NULL, it is set to the first invalid character in buf.
 * @param base A numeric base in the range between 2 and 36 inclusive,
 *   or 0.  If base is zero, buf will be treated as base ten unless its
 *   digits are prefixed with '0x', in which case it will be treated as
 *   base 16.
 * @bug *end breaks type safety; where *buf is const, *end needs to be
 * declared as const in APR 2.0
 */
APR_DECLARE(apr_status_t) apr_strtoff(apr_off_t *offset, const char *buf, 
                                      char **end, int base);

/**
 * parse a numeric string into a 64-bit numeric value
 * @param buf The string to parse. It may contain optional whitespace,
 *   followed by an optional '+' (positive, default) or '-' (negative)
 *   character, followed by an optional '0x' prefix if base is 0 or 16,
 *   followed by numeric digits appropriate for base.
 * @param end A pointer to the end of the valid character in buf. If
 *   not NULL, it is set to the first invalid character in buf.
 * @param base A numeric base in the range between 2 and 36 inclusive,
 *   or 0.  If base is zero, buf will be treated as base ten unless its
 *   digits are prefixed with '0x', in which case it will be treated as
 *   base 16.
 * @return The numeric value of the string.  On overflow, errno is set
 * to ERANGE.  On success, errno is set to 0.
 */
APR_DECLARE(apr_int64_t) apr_strtoi64(const char *buf, char **end, int base);

/**
 * parse a base-10 numeric string into a 64-bit numeric value.
 * Equivalent to apr_strtoi64(buf, (char**)NULL, 10).
 * @param buf The string to parse
 * @return The numeric value of the string.  On overflow, errno is set
 * to ERANGE.  On success, errno is set to 0.
 */
APR_DECLARE(apr_int64_t) apr_atoi64(const char *buf);

/**
 * Format a binary size (magnitiudes are 2^10 rather than 10^3) from an apr_off_t,
 * as bytes, K, M, T, etc, to a four character compacted human readable string.
 * @param size The size to format
 * @param buf The 5 byte text buffer (counting the trailing null)
 * @return The buf passed to apr_strfsize()
 * @remark All negative sizes report '  - ', apr_strfsize only formats positive values.
 */
APR_DECLARE(char *) apr_strfsize(apr_off_t size, char *buf);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* !APR_STRINGS_H */
include/apr-1/apr_optional.h000064400000005334150336140420011752 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_OPTIONAL_H
#define APR_OPTIONAL_H

#include "apu.h"
/** 
 * @file apr_optional.h
 * @brief APR-UTIL registration of functions exported by modules
 */
#ifdef __cplusplus
extern "C" {
#endif

/** 
 * @defgroup APR_Util_Opt Optional Functions
 * @ingroup APR_Util
 *
 * Typesafe registration and retrieval of functions that may not be present
 * (i.e. functions exported by optional modules)
 * @{
 */

/**
 * The type of an optional function.
 * @param name The name of the function
 */
#define APR_OPTIONAL_FN_TYPE(name) apr_OFN_##name##_t

/**
 * Declare an optional function.
 * @param ret The return type of the function
 * @param name The name of the function
 * @param args The function arguments (including brackets)
 */
#define APR_DECLARE_OPTIONAL_FN(ret,name,args) \
typedef ret (APR_OPTIONAL_FN_TYPE(name)) args

/**
 * XXX: This doesn't belong here, then!
 * Private function! DO NOT USE! 
 * @internal
 */

typedef void (apr_opt_fn_t)(void);
/** @internal */
APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName, 
                                                  apr_opt_fn_t *pfn);

/**
 * Register an optional function. This can be later retrieved, type-safely, by
 * name. Like all global functions, the name must be unique. Note that,
 * confusingly but correctly, the function itself can be static!
 * @param name The name of the function
 */
#define APR_REGISTER_OPTIONAL_FN(name) do { \
  APR_OPTIONAL_FN_TYPE(name) *apu__opt = name; \
  apr_dynamic_fn_register(#name,(apr_opt_fn_t *)apu__opt); \
} while (0)

/** @internal
 * Private function! DO NOT USE! 
 */
APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName);

/**
 * Retrieve an optional function. Returns NULL if the function is not present.
 * @param name The name of the function
 */
#define APR_RETRIEVE_OPTIONAL_FN(name) \
	(APR_OPTIONAL_FN_TYPE(name) *)apr_dynamic_fn_retrieve(#name)

/** @} */
#ifdef __cplusplus
}
#endif

#endif /* APR_OPTIONAL_H */
include/apr-1/apr_xml.h000064400000030306150336140420010722 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file apr_xml.h
 * @brief APR-UTIL XML Library
 */
#ifndef APR_XML_H
#define APR_XML_H

/**
 * @defgroup APR_Util_XML XML 
 * @ingroup APR_Util
 * @{
 */
#include "apr_pools.h"
#include "apr_tables.h"
#include "apr_file_io.h"

#include "apu.h"
#if APR_CHARSET_EBCDIC
#include "apr_xlate.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @package Apache XML library
 */

/* -------------------------------------------------------------------- */

/* ### these will need to move at some point to a more logical spot */

/** @see apr_text */
typedef struct apr_text apr_text;

/** Structure to keep a linked list of pieces of text */
struct apr_text {
    /** The current piece of text */
    const char *text;
    /** a pointer to the next piece of text */
    struct apr_text *next;
};

/** @see apr_text_header */
typedef struct apr_text_header apr_text_header;

/** A list of pieces of text */
struct apr_text_header {
    /** The first piece of text in the list */
    apr_text *first;
    /** The last piece of text in the list */
    apr_text *last;
};

/**
 * Append a piece of text to the end of a list
 * @param p The pool to allocate out of
 * @param hdr The text header to append to
 * @param text The new text to append
 */
APU_DECLARE(void) apr_text_append(apr_pool_t *p, apr_text_header *hdr,
                                  const char *text);


/* --------------------------------------------------------------------
**
** XML PARSING
*/

/*
** Qualified namespace values
**
** APR_XML_NS_DAV_ID
**    We always insert the "DAV:" namespace URI at the head of the
**    namespace array. This means that it will always be at ID==0,
**    making it much easier to test for.
**
** APR_XML_NS_NONE
**    This special ID is used for two situations:
**
**    1) The namespace prefix begins with "xml" (and we do not know
**       what it means). Namespace prefixes with "xml" (any case) as
**       their first three characters are reserved by the XML Namespaces
**       specification for future use. mod_dav will pass these through
**       unchanged. When this identifier is used, the prefix is LEFT in
**       the element/attribute name. Downstream processing should not
**       prepend another prefix.
**
**    2) The element/attribute does not have a namespace.
**
**       a) No prefix was used, and a default namespace has not been
**          defined.
**       b) No prefix was used, and the default namespace was specified
**          to mean "no namespace". This is done with a namespace
**          declaration of:  xmlns=""
**          (this declaration is typically used to override a previous
**          specification for the default namespace)
**
**       In these cases, we need to record that the elem/attr has no
**       namespace so that we will not attempt to prepend a prefix.
**       All namespaces that are used will have a prefix assigned to
**       them -- mod_dav will never set or use the default namespace
**       when generating XML. This means that "no prefix" will always
**       mean "no namespace".
**
**    In both cases, the XML generation will avoid prepending a prefix.
**    For the first case, this means the original prefix/name will be
**    inserted into the output stream. For the latter case, it means
**    the name will have no prefix, and since we never define a default
**    namespace, this means it will have no namespace.
**
** Note: currently, mod_dav understands the "xmlns" prefix and the
**     "xml:lang" attribute. These are handled specially (they aren't
**     left within the XML tree), so the APR_XML_NS_NONE value won't ever
**     really apply to these values.
*/
#define APR_XML_NS_DAV_ID	0	/**< namespace ID for "DAV:" */
#define APR_XML_NS_NONE		-10	/**< no namespace for this elem/attr */

#define APR_XML_NS_ERROR_BASE	-100	/**< used only during processing */
/** Is this namespace an error? */
#define APR_XML_NS_IS_ERROR(e)	((e) <= APR_XML_NS_ERROR_BASE)

/** @see apr_xml_attr */
typedef struct apr_xml_attr apr_xml_attr;
/** @see apr_xml_elem */
typedef struct apr_xml_elem apr_xml_elem;
/** @see apr_xml_doc */
typedef struct apr_xml_doc apr_xml_doc;

/** apr_xml_attr: holds a parsed XML attribute */
struct apr_xml_attr {
    /** attribute name */
    const char *name;
    /** index into namespace array */
    int ns;

    /** attribute value */
    const char *value;

    /** next attribute */
    struct apr_xml_attr *next;
};

/** apr_xml_elem: holds a parsed XML element */
struct apr_xml_elem {
    /** element name */
    const char *name;
    /** index into namespace array */
    int ns;
    /** xml:lang for attrs/contents */
    const char *lang;

    /** cdata right after start tag */
    apr_text_header first_cdata;
    /** cdata after MY end tag */
    apr_text_header following_cdata;

    /** parent element */
    struct apr_xml_elem *parent;	
    /** next (sibling) element */
    struct apr_xml_elem *next;	
    /** first child element */
    struct apr_xml_elem *first_child;
    /** first attribute */
    struct apr_xml_attr *attr;		

    /* used only during parsing */
    /** last child element */
    struct apr_xml_elem *last_child;
    /** namespaces scoped by this elem */
    struct apr_xml_ns_scope *ns_scope;

    /* used by modules during request processing */
    /** Place for modules to store private data */
    void *priv;
};

/** Is this XML element empty? */
#define APR_XML_ELEM_IS_EMPTY(e) ((e)->first_child == NULL && \
                                  (e)->first_cdata.first == NULL)

/** apr_xml_doc: holds a parsed XML document */
struct apr_xml_doc {
    /** root element */
    apr_xml_elem *root;	
    /** array of namespaces used */
    apr_array_header_t *namespaces;
};

/** Opaque XML parser structure */
typedef struct apr_xml_parser apr_xml_parser;

/**
 * Create an XML parser
 * @param pool The pool for allocating the parser and the parse results.
 * @return The new parser.
 */
APU_DECLARE(apr_xml_parser *) apr_xml_parser_create(apr_pool_t *pool);

/**
 * Parse a File, producing a xml_doc
 * @param p      The pool for allocating the parse results.
 * @param parser A pointer to *parser (needed so calling function can get
 *               errors), will be set to NULL on successful completion.
 * @param ppdoc  A pointer to *apr_xml_doc (which has the parsed results in it)
 * @param xmlfd  A file to read from.
 * @param buffer_length Buffer length which would be suitable 
 * @return Any errors found during parsing.
 */
APU_DECLARE(apr_status_t) apr_xml_parse_file(apr_pool_t *p,
                                             apr_xml_parser **parser,
                                             apr_xml_doc **ppdoc,
                                             apr_file_t *xmlfd,
                                             apr_size_t buffer_length);


/**
 * Feed input into the parser
 * @param parser The XML parser for parsing this data.
 * @param data The data to parse.
 * @param len The length of the data.
 * @return Any errors found during parsing.
 * @remark Use apr_xml_parser_geterror() to get more error information.
 */
APU_DECLARE(apr_status_t) apr_xml_parser_feed(apr_xml_parser *parser,
                                              const char *data,
                                              apr_size_t len);

/**
 * Terminate the parsing and return the result
 * @param parser The XML parser for parsing this data.
 * @param pdoc The resulting parse information. May be NULL to simply
 *             terminate the parsing without fetching the info.
 * @return Any errors found during the final stage of parsing.
 * @remark Use apr_xml_parser_geterror() to get more error information.
 */
APU_DECLARE(apr_status_t) apr_xml_parser_done(apr_xml_parser *parser,
                                              apr_xml_doc **pdoc);

/**
 * Fetch additional error information from the parser.
 * @param parser The XML parser to query for errors.
 * @param errbuf A buffer for storing error text.
 * @param errbufsize The length of the error text buffer.
 * @return The error buffer
 */
APU_DECLARE(char *) apr_xml_parser_geterror(apr_xml_parser *parser,
                                            char *errbuf,
                                            apr_size_t errbufsize);


/**
 * Converts an XML element tree to flat text 
 * @param p The pool to allocate out of
 * @param elem The XML element to convert
 * @param style How to covert the XML.  One of:
 * <PRE>
 *     APR_XML_X2T_FULL                start tag, contents, end tag 
 *     APR_XML_X2T_INNER               contents only 
 *     APR_XML_X2T_LANG_INNER          xml:lang + inner contents 
 *     APR_XML_X2T_FULL_NS_LANG        FULL + ns defns + xml:lang 
 *     APR_XML_X2T_PARSED              original prefixes
 * </PRE>
 * @param namespaces The namespace of the current XML element
 * @param ns_map Namespace mapping
 * @param pbuf Buffer to put the converted text into
 * @param psize Size of the converted text
 */
APU_DECLARE(void) apr_xml_to_text(apr_pool_t *p, const apr_xml_elem *elem,
                                  int style, apr_array_header_t *namespaces,
                                  int *ns_map, const char **pbuf,
                                  apr_size_t *psize);

/* style argument values: */
#define APR_XML_X2T_FULL         0	/**< start tag, contents, end tag */
#define APR_XML_X2T_INNER        1	/**< contents only */
#define APR_XML_X2T_LANG_INNER   2	/**< xml:lang + inner contents */
#define APR_XML_X2T_FULL_NS_LANG 3	/**< FULL + ns defns + xml:lang */
#define APR_XML_X2T_PARSED       4	/**< original prefixes */

/**
 * empty XML element
 * @param p The pool to allocate out of
 * @param elem The XML element to empty
 * @return the string that was stored in the XML element
 */
APU_DECLARE(const char *) apr_xml_empty_elem(apr_pool_t *p,
                                             const apr_xml_elem *elem);

/**
 * quote an XML string
 * Replace '\<', '\>', and '\&' with '\&lt;', '\&gt;', and '\&amp;'.
 * @param p The pool to allocate out of
 * @param s The string to quote
 * @param quotes If quotes is true, then replace '&quot;' with '\&quot;'.
 * @return The quoted string
 * @note If the string does not contain special characters, it is not
 * duplicated into the pool and the original string is returned.
 */
APU_DECLARE(const char *) apr_xml_quote_string(apr_pool_t *p, const char *s,
                                               int quotes);

/**
 * Quote an XML element
 * @param p The pool to allocate out of
 * @param elem The element to quote
 */
APU_DECLARE(void) apr_xml_quote_elem(apr_pool_t *p, apr_xml_elem *elem);

/* manage an array of unique URIs: apr_xml_insert_uri() and APR_XML_URI_ITEM() */

/**
 * return the URI's (existing) index, or insert it and return a new index 
 * @param uri_array array to insert into
 * @param uri The uri to insert
 * @return int The uri's index
 */
APU_DECLARE(int) apr_xml_insert_uri(apr_array_header_t *uri_array,
                                    const char *uri);

/** Get the URI item for this XML element */
#define APR_XML_GET_URI_ITEM(ary, i) (((const char * const *)(ary)->elts)[i])

#if APR_CHARSET_EBCDIC
/**
 * Convert parsed tree in EBCDIC 
 * @param p The pool to allocate out of
 * @param pdoc The apr_xml_doc to convert.
 * @param xlate The translation handle to use.
 * @return Any errors found during conversion.
 */
APU_DECLARE(apr_status_t) apr_xml_parser_convert_doc(apr_pool_t *p,
                                                     apr_xml_doc *pdoc,
                                                     apr_xlate_t *convset);
#endif

#ifdef __cplusplus
}
#endif
/** @} */
#endif /* APR_XML_H */
include/apr-1/apr_thread_cond.h000064400000012625150336140420012400 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_THREAD_COND_H
#define APR_THREAD_COND_H

/**
 * @file apr_thread_cond.h
 * @brief APR Condition Variable Routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_time.h"
#include "apr_thread_mutex.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#if APR_HAS_THREADS || defined(DOXYGEN)

/**
 * @defgroup apr_thread_cond Condition Variable Routines
 * @ingroup APR 
 * @{
 */

/** Opaque structure for thread condition variables */
typedef struct apr_thread_cond_t apr_thread_cond_t;

/**
 * Note: destroying a condition variable (or likewise, destroying or
 * clearing the pool from which a condition variable was allocated) if
 * any threads are blocked waiting on it gives undefined results.
 */

/**
 * Create and initialize a condition variable that can be used to signal
 * and schedule threads in a single process.
 * @param cond the memory address where the newly created condition variable
 *        will be stored.
 * @param pool the pool from which to allocate the condition.
 */
APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond,
                                                 apr_pool_t *pool);

/**
 * Put the active calling thread to sleep until signaled to wake up. Each
 * condition variable must be associated with a mutex, and that mutex must
 * be locked before  calling this function, or the behavior will be
 * undefined. As the calling thread is put to sleep, the given mutex
 * will be simultaneously released; and as this thread wakes up the lock
 * is again simultaneously acquired.
 * @param cond the condition variable on which to block.
 * @param mutex the mutex that must be locked upon entering this function,
 *        is released while the thread is asleep, and is again acquired before
 *        returning from this function.
 * @remark Spurious wakeups may occur. Before and after every call to wait on
 * a condition variable, the caller should test whether the condition is already
 * met.
 */
APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond,
                                               apr_thread_mutex_t *mutex);

/**
 * Put the active calling thread to sleep until signaled to wake up or
 * the timeout is reached. Each condition variable must be associated
 * with a mutex, and that mutex must be locked before calling this
 * function, or the behavior will be undefined. As the calling thread
 * is put to sleep, the given mutex will be simultaneously released;
 * and as this thread wakes up the lock is again simultaneously acquired.
 * @param cond the condition variable on which to block.
 * @param mutex the mutex that must be locked upon entering this function,
 *        is released while the thread is asleep, and is again acquired before
 *        returning from this function.
 * @param timeout The amount of time in microseconds to wait. This is 
 *        a maximum, not a minimum. If the condition is signaled, we 
 *        will wake up before this time, otherwise the error APR_TIMEUP
 *        is returned.
 */
APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond,
                                                    apr_thread_mutex_t *mutex,
                                                    apr_interval_time_t timeout);

/**
 * Signals a single thread, if one exists, that is blocking on the given
 * condition variable. That thread is then scheduled to wake up and acquire
 * the associated mutex. Although it is not required, if predictable scheduling
 * is desired, that mutex must be locked while calling this function.
 * @param cond the condition variable on which to produce the signal.
 * @remark If no threads are waiting on the condition variable, nothing happens.
 */
APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond);

/**
 * Signals all threads blocking on the given condition variable.
 * Each thread that was signaled is then scheduled to wake up and acquire
 * the associated mutex. This will happen in a serialized manner.
 * @param cond the condition variable on which to produce the broadcast.
 * @remark If no threads are waiting on the condition variable, nothing happens.
 */
APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond);

/**
 * Destroy the condition variable and free the associated memory.
 * @param cond the condition variable to destroy.
 */
APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond);

/**
 * Get the pool used by this thread_cond.
 * @return apr_pool_t the pool
 */
APR_POOL_DECLARE_ACCESSOR(thread_cond);

#endif /* APR_HAS_THREADS */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_THREAD_COND_H */
include/apr-1/apr_errno.h000064400000153425150336140420011257 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_ERRNO_H
#define APR_ERRNO_H

/**
 * @file apr_errno.h
 * @brief APR Error Codes
 */

#include "apr.h"

#if APR_HAVE_ERRNO_H
#include <errno.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_errno Error Codes
 * @ingroup APR
 * @{
 */

/**
 * Type for specifying an error or status code.
 */
typedef int apr_status_t;

/**
 * Return a human readable string describing the specified error.
 * @param statcode The error code to get a string for.
 * @param buf A buffer to hold the error string.
 * @param bufsize Size of the buffer to hold the string.
 */
APR_DECLARE(char *) apr_strerror(apr_status_t statcode, char *buf,
                                 apr_size_t bufsize);

#if defined(DOXYGEN)
/**
 * @def APR_FROM_OS_ERROR(os_err_type syserr)
 * Fold a platform specific error into an apr_status_t code.
 * @return apr_status_t
 * @param e The platform os error code.
 * @warning  macro implementation; the syserr argument may be evaluated
 *      multiple times.
 */
#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)

/**
 * @def APR_TO_OS_ERROR(apr_status_t statcode)
 * @return os_err_type
 * Fold an apr_status_t code back to the native platform defined error.
 * @param e The apr_status_t folded platform os error code.
 * @warning  macro implementation; the statcode argument may be evaluated
 *      multiple times.  If the statcode was not created by apr_get_os_error
 *      or APR_FROM_OS_ERROR, the results are undefined.
 */
#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)

/** @def apr_get_os_error()
 * @return apr_status_t the last platform error, folded into apr_status_t, on most platforms
 * @remark This retrieves errno, or calls a GetLastError() style function, and
 *      folds it with APR_FROM_OS_ERROR.  Some platforms (such as OS2) have no
 *      such mechanism, so this call may be unsupported.  Do NOT use this
 *      call for socket errors from socket, send, recv etc!
 */

/** @def apr_set_os_error(e)
 * Reset the last platform error, unfolded from an apr_status_t, on some platforms
 * @param e The OS error folded in a prior call to APR_FROM_OS_ERROR()
 * @warning This is a macro implementation; the statcode argument may be evaluated
 *      multiple times.  If the statcode was not created by apr_get_os_error
 *      or APR_FROM_OS_ERROR, the results are undefined.  This macro sets
 *      errno, or calls a SetLastError() style function, unfolding statcode
 *      with APR_TO_OS_ERROR.  Some platforms (such as OS2) have no such
 *      mechanism, so this call may be unsupported.
 */

/** @def apr_get_netos_error()
 * Return the last socket error, folded into apr_status_t, on all platforms
 * @remark This retrieves errno or calls a GetLastSocketError() style function,
 *      and folds it with APR_FROM_OS_ERROR.
 */

/** @def apr_set_netos_error(e)
 * Reset the last socket error, unfolded from an apr_status_t
 * @param e The socket error folded in a prior call to APR_FROM_OS_ERROR()
 * @warning This is a macro implementation; the statcode argument may be evaluated
 *      multiple times.  If the statcode was not created by apr_get_os_error
 *      or APR_FROM_OS_ERROR, the results are undefined.  This macro sets
 *      errno, or calls a WSASetLastError() style function, unfolding
 *      socketcode with APR_TO_OS_ERROR.
 */

#endif /* defined(DOXYGEN) */

/**
 * APR_OS_START_ERROR is where the APR specific error values start.
 */
#define APR_OS_START_ERROR     20000
/**
 * APR_OS_ERRSPACE_SIZE is the maximum number of errors you can fit
 *    into one of the error/status ranges below -- except for
 *    APR_OS_START_USERERR, which see.
 */
#define APR_OS_ERRSPACE_SIZE 50000
/**
 * APR_UTIL_ERRSPACE_SIZE is the size of the space that is reserved for
 * use within apr-util. This space is reserved above that used by APR
 * internally.
 * @note This number MUST be smaller than APR_OS_ERRSPACE_SIZE by a
 *       large enough amount that APR has sufficient room for its
 *       codes.
 */
#define APR_UTIL_ERRSPACE_SIZE 20000
/**
 * APR_OS_START_STATUS is where the APR specific status codes start.
 */
#define APR_OS_START_STATUS    (APR_OS_START_ERROR + APR_OS_ERRSPACE_SIZE)
/**
 * APR_UTIL_START_STATUS is where APR-Util starts defining its
 * status codes.
 */
#define APR_UTIL_START_STATUS   (APR_OS_START_STATUS + \
                           (APR_OS_ERRSPACE_SIZE - APR_UTIL_ERRSPACE_SIZE))
/**
 * APR_OS_START_USERERR are reserved for applications that use APR that
 *     layer their own error codes along with APR's.  Note that the
 *     error immediately following this one is set ten times farther
 *     away than usual, so that users of apr have a lot of room in
 *     which to declare custom error codes.
 *
 * In general applications should try and create unique error codes. To try
 * and assist in finding suitable ranges of numbers to use, the following
 * ranges are known to be used by the listed applications. If your
 * application defines error codes please advise the range of numbers it
 * uses to dev@apr.apache.org for inclusion in this list.
 *
 * Ranges shown are in relation to APR_OS_START_USERERR
 *
 * Subversion - Defined ranges, of less than 100, at intervals of 5000
 *              starting at an offset of 5000, e.g.
 *               +5000 to 5100,  +10000 to 10100
 *
 * Apache HTTPD - +2000 to 2999
 */
#define APR_OS_START_USERERR    (APR_OS_START_STATUS + APR_OS_ERRSPACE_SIZE)
/**
 * APR_OS_START_USEERR is obsolete, defined for compatibility only.
 * Use APR_OS_START_USERERR instead.
 */
#define APR_OS_START_USEERR     APR_OS_START_USERERR
/**
 * APR_OS_START_CANONERR is where APR versions of errno values are defined
 *     on systems which don't have the corresponding errno.
 */
#define APR_OS_START_CANONERR  (APR_OS_START_USERERR \
                                 + (APR_OS_ERRSPACE_SIZE * 10))
/**
 * APR_OS_START_EAIERR folds EAI_ error codes from getaddrinfo() into
 *     apr_status_t values.
 */
#define APR_OS_START_EAIERR    (APR_OS_START_CANONERR + APR_OS_ERRSPACE_SIZE)
/**
 * APR_OS_START_SYSERR folds platform-specific system error values into
 *     apr_status_t values.
 */
#define APR_OS_START_SYSERR    (APR_OS_START_EAIERR + APR_OS_ERRSPACE_SIZE)

/**
 * @defgroup APR_ERROR_map APR Error Space
 * <PRE>
 * The following attempts to show the relation of the various constants
 * used for mapping APR Status codes.
 *
 *       0
 *
 *  20,000     APR_OS_START_ERROR
 *
 *         + APR_OS_ERRSPACE_SIZE (50,000)
 *
 *  70,000      APR_OS_START_STATUS
 *
 *         + APR_OS_ERRSPACE_SIZE - APR_UTIL_ERRSPACE_SIZE (30,000)
 *
 * 100,000      APR_UTIL_START_STATUS
 *
 *         + APR_UTIL_ERRSPACE_SIZE (20,000)
 *
 * 120,000      APR_OS_START_USERERR
 *
 *         + 10 x APR_OS_ERRSPACE_SIZE (50,000 * 10)
 *
 * 620,000      APR_OS_START_CANONERR
 *
 *         + APR_OS_ERRSPACE_SIZE (50,000)
 *
 * 670,000      APR_OS_START_EAIERR
 *
 *         + APR_OS_ERRSPACE_SIZE (50,000)
 *
 * 720,000      APR_OS_START_SYSERR
 *
 * </PRE>
 */

/** no error. */
#define APR_SUCCESS 0

/**
 * @defgroup APR_Error APR Error Values
 * <PRE>
 * <b>APR ERROR VALUES</b>
 * APR_ENOSTAT      APR was unable to perform a stat on the file
 * APR_ENOPOOL      APR was not provided a pool with which to allocate memory
 * APR_EBADDATE     APR was given an invalid date
 * APR_EINVALSOCK   APR was given an invalid socket
 * APR_ENOPROC      APR was not given a process structure
 * APR_ENOTIME      APR was not given a time structure
 * APR_ENODIR       APR was not given a directory structure
 * APR_ENOLOCK      APR was not given a lock structure
 * APR_ENOPOLL      APR was not given a poll structure
 * APR_ENOSOCKET    APR was not given a socket
 * APR_ENOTHREAD    APR was not given a thread structure
 * APR_ENOTHDKEY    APR was not given a thread key structure
 * APR_ENOSHMAVAIL  There is no more shared memory available
 * APR_EDSOOPEN     APR was unable to open the dso object.  For more
 *                  information call apr_dso_error().
 * APR_EGENERAL     General failure (specific information not available)
 * APR_EBADIP       The specified IP address is invalid
 * APR_EBADMASK     The specified netmask is invalid
 * APR_ESYMNOTFOUND Could not find the requested symbol
 * APR_ENOTENOUGHENTROPY Not enough entropy to continue
 * </PRE>
 *
 * <PRE>
 * <b>APR STATUS VALUES</b>
 * APR_INCHILD        Program is currently executing in the child
 * APR_INPARENT       Program is currently executing in the parent
 * APR_DETACH         The thread is detached
 * APR_NOTDETACH      The thread is not detached
 * APR_CHILD_DONE     The child has finished executing
 * APR_CHILD_NOTDONE  The child has not finished executing
 * APR_TIMEUP         The operation did not finish before the timeout
 * APR_INCOMPLETE     The operation was incomplete although some processing
 *                    was performed and the results are partially valid
 * APR_BADCH          Getopt found an option not in the option string
 * APR_BADARG         Getopt found an option that is missing an argument
 *                    and an argument was specified in the option string
 * APR_EOF            APR has encountered the end of the file
 * APR_NOTFOUND       APR was unable to find the socket in the poll structure
 * APR_ANONYMOUS      APR is using anonymous shared memory
 * APR_FILEBASED      APR is using a file name as the key to the shared memory
 * APR_KEYBASED       APR is using a shared key as the key to the shared memory
 * APR_EINIT          Ininitalizer value.  If no option has been found, but
 *                    the status variable requires a value, this should be used
 * APR_ENOTIMPL       The APR function has not been implemented on this
 *                    platform, either because nobody has gotten to it yet,
 *                    or the function is impossible on this platform.
 * APR_EMISMATCH      Two passwords do not match.
 * APR_EABSOLUTE      The given path was absolute.
 * APR_ERELATIVE      The given path was relative.
 * APR_EINCOMPLETE    The given path was neither relative nor absolute.
 * APR_EABOVEROOT     The given path was above the root path.
 * APR_EBUSY          The given lock was busy.
 * APR_EPROC_UNKNOWN  The given process wasn't recognized by APR
 * </PRE>
 * @{
 */
/** @see APR_STATUS_IS_ENOSTAT */
#define APR_ENOSTAT        (APR_OS_START_ERROR + 1)
/** @see APR_STATUS_IS_ENOPOOL */
#define APR_ENOPOOL        (APR_OS_START_ERROR + 2)
/* empty slot: +3 */
/** @see APR_STATUS_IS_EBADDATE */
#define APR_EBADDATE       (APR_OS_START_ERROR + 4)
/** @see APR_STATUS_IS_EINVALSOCK */
#define APR_EINVALSOCK     (APR_OS_START_ERROR + 5)
/** @see APR_STATUS_IS_ENOPROC */
#define APR_ENOPROC        (APR_OS_START_ERROR + 6)
/** @see APR_STATUS_IS_ENOTIME */
#define APR_ENOTIME        (APR_OS_START_ERROR + 7)
/** @see APR_STATUS_IS_ENODIR */
#define APR_ENODIR         (APR_OS_START_ERROR + 8)
/** @see APR_STATUS_IS_ENOLOCK */
#define APR_ENOLOCK        (APR_OS_START_ERROR + 9)
/** @see APR_STATUS_IS_ENOPOLL */
#define APR_ENOPOLL        (APR_OS_START_ERROR + 10)
/** @see APR_STATUS_IS_ENOSOCKET */
#define APR_ENOSOCKET      (APR_OS_START_ERROR + 11)
/** @see APR_STATUS_IS_ENOTHREAD */
#define APR_ENOTHREAD      (APR_OS_START_ERROR + 12)
/** @see APR_STATUS_IS_ENOTHDKEY */
#define APR_ENOTHDKEY      (APR_OS_START_ERROR + 13)
/** @see APR_STATUS_IS_EGENERAL */
#define APR_EGENERAL       (APR_OS_START_ERROR + 14)
/** @see APR_STATUS_IS_ENOSHMAVAIL */
#define APR_ENOSHMAVAIL    (APR_OS_START_ERROR + 15)
/** @see APR_STATUS_IS_EBADIP */
#define APR_EBADIP         (APR_OS_START_ERROR + 16)
/** @see APR_STATUS_IS_EBADMASK */
#define APR_EBADMASK       (APR_OS_START_ERROR + 17)
/* empty slot: +18 */
/** @see APR_STATUS_IS_EDSOPEN */
#define APR_EDSOOPEN       (APR_OS_START_ERROR + 19)
/** @see APR_STATUS_IS_EABSOLUTE */
#define APR_EABSOLUTE      (APR_OS_START_ERROR + 20)
/** @see APR_STATUS_IS_ERELATIVE */
#define APR_ERELATIVE      (APR_OS_START_ERROR + 21)
/** @see APR_STATUS_IS_EINCOMPLETE */
#define APR_EINCOMPLETE    (APR_OS_START_ERROR + 22)
/** @see APR_STATUS_IS_EABOVEROOT */
#define APR_EABOVEROOT     (APR_OS_START_ERROR + 23)
/** @see APR_STATUS_IS_EBADPATH */
#define APR_EBADPATH       (APR_OS_START_ERROR + 24)
/** @see APR_STATUS_IS_EPATHWILD */
#define APR_EPATHWILD      (APR_OS_START_ERROR + 25)
/** @see APR_STATUS_IS_ESYMNOTFOUND */
#define APR_ESYMNOTFOUND   (APR_OS_START_ERROR + 26)
/** @see APR_STATUS_IS_EPROC_UNKNOWN */
#define APR_EPROC_UNKNOWN  (APR_OS_START_ERROR + 27)
/** @see APR_STATUS_IS_ENOTENOUGHENTROPY */
#define APR_ENOTENOUGHENTROPY (APR_OS_START_ERROR + 28)
/** @} */

/**
 * @defgroup APR_STATUS_IS Status Value Tests
 * @warning For any particular error condition, more than one of these tests
 *      may match. This is because platform-specific error codes may not
 *      always match the semantics of the POSIX codes these tests (and the
 *      corresponding APR error codes) are named after. A notable example
 *      are the APR_STATUS_IS_ENOENT and APR_STATUS_IS_ENOTDIR tests on
 *      Win32 platforms. The programmer should always be aware of this and
 *      adjust the order of the tests accordingly.
 * @{
 */
/**
 * APR was unable to perform a stat on the file
 * @warning always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_ENOSTAT(s)        ((s) == APR_ENOSTAT)
/**
 * APR was not provided a pool with which to allocate memory
 * @warning always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_ENOPOOL(s)        ((s) == APR_ENOPOOL)
/** APR was given an invalid date  */
#define APR_STATUS_IS_EBADDATE(s)       ((s) == APR_EBADDATE)
/** APR was given an invalid socket */
#define APR_STATUS_IS_EINVALSOCK(s)     ((s) == APR_EINVALSOCK)
/** APR was not given a process structure */
#define APR_STATUS_IS_ENOPROC(s)        ((s) == APR_ENOPROC)
/** APR was not given a time structure */
#define APR_STATUS_IS_ENOTIME(s)        ((s) == APR_ENOTIME)
/** APR was not given a directory structure */
#define APR_STATUS_IS_ENODIR(s)         ((s) == APR_ENODIR)
/** APR was not given a lock structure */
#define APR_STATUS_IS_ENOLOCK(s)        ((s) == APR_ENOLOCK)
/** APR was not given a poll structure */
#define APR_STATUS_IS_ENOPOLL(s)        ((s) == APR_ENOPOLL)
/** APR was not given a socket */
#define APR_STATUS_IS_ENOSOCKET(s)      ((s) == APR_ENOSOCKET)
/** APR was not given a thread structure */
#define APR_STATUS_IS_ENOTHREAD(s)      ((s) == APR_ENOTHREAD)
/** APR was not given a thread key structure */
#define APR_STATUS_IS_ENOTHDKEY(s)      ((s) == APR_ENOTHDKEY)
/** Generic Error which can not be put into another spot */
#define APR_STATUS_IS_EGENERAL(s)       ((s) == APR_EGENERAL)
/** There is no more shared memory available */
#define APR_STATUS_IS_ENOSHMAVAIL(s)    ((s) == APR_ENOSHMAVAIL)
/** The specified IP address is invalid */
#define APR_STATUS_IS_EBADIP(s)         ((s) == APR_EBADIP)
/** The specified netmask is invalid */
#define APR_STATUS_IS_EBADMASK(s)       ((s) == APR_EBADMASK)
/* empty slot: +18 */
/**
 * APR was unable to open the dso object.
 * For more information call apr_dso_error().
 */
#if defined(WIN32)
#define APR_STATUS_IS_EDSOOPEN(s)       ((s) == APR_EDSOOPEN \
                       || APR_TO_OS_ERROR(s) == ERROR_MOD_NOT_FOUND)
#else
#define APR_STATUS_IS_EDSOOPEN(s)       ((s) == APR_EDSOOPEN)
#endif
/** The given path was absolute. */
#define APR_STATUS_IS_EABSOLUTE(s)      ((s) == APR_EABSOLUTE)
/** The given path was relative. */
#define APR_STATUS_IS_ERELATIVE(s)      ((s) == APR_ERELATIVE)
/** The given path was neither relative nor absolute. */
#define APR_STATUS_IS_EINCOMPLETE(s)    ((s) == APR_EINCOMPLETE)
/** The given path was above the root path. */
#define APR_STATUS_IS_EABOVEROOT(s)     ((s) == APR_EABOVEROOT)
/** The given path was bad. */
#define APR_STATUS_IS_EBADPATH(s)       ((s) == APR_EBADPATH)
/** The given path contained wildcards. */
#define APR_STATUS_IS_EPATHWILD(s)      ((s) == APR_EPATHWILD)
/** Could not find the requested symbol.
 * For more information call apr_dso_error().
 */
#if defined(WIN32)
#define APR_STATUS_IS_ESYMNOTFOUND(s)   ((s) == APR_ESYMNOTFOUND \
                       || APR_TO_OS_ERROR(s) == ERROR_PROC_NOT_FOUND)
#else
#define APR_STATUS_IS_ESYMNOTFOUND(s)   ((s) == APR_ESYMNOTFOUND)
#endif
/** The given process was not recognized by APR. */
#define APR_STATUS_IS_EPROC_UNKNOWN(s)  ((s) == APR_EPROC_UNKNOWN)
/** APR could not gather enough entropy to continue. */
#define APR_STATUS_IS_ENOTENOUGHENTROPY(s) ((s) == APR_ENOTENOUGHENTROPY)

/** @} */

/**
 * @addtogroup APR_Error
 * @{
 */
/** @see APR_STATUS_IS_INCHILD */
#define APR_INCHILD        (APR_OS_START_STATUS + 1)
/** @see APR_STATUS_IS_INPARENT */
#define APR_INPARENT       (APR_OS_START_STATUS + 2)
/** @see APR_STATUS_IS_DETACH */
#define APR_DETACH         (APR_OS_START_STATUS + 3)
/** @see APR_STATUS_IS_NOTDETACH */
#define APR_NOTDETACH      (APR_OS_START_STATUS + 4)
/** @see APR_STATUS_IS_CHILD_DONE */
#define APR_CHILD_DONE     (APR_OS_START_STATUS + 5)
/** @see APR_STATUS_IS_CHILD_NOTDONE */
#define APR_CHILD_NOTDONE  (APR_OS_START_STATUS + 6)
/** @see APR_STATUS_IS_TIMEUP */
#define APR_TIMEUP         (APR_OS_START_STATUS + 7)
/** @see APR_STATUS_IS_INCOMPLETE */
#define APR_INCOMPLETE     (APR_OS_START_STATUS + 8)
/* empty slot: +9 */
/* empty slot: +10 */
/* empty slot: +11 */
/** @see APR_STATUS_IS_BADCH */
#define APR_BADCH          (APR_OS_START_STATUS + 12)
/** @see APR_STATUS_IS_BADARG */
#define APR_BADARG         (APR_OS_START_STATUS + 13)
/** @see APR_STATUS_IS_EOF */
#define APR_EOF            (APR_OS_START_STATUS + 14)
/** @see APR_STATUS_IS_NOTFOUND */
#define APR_NOTFOUND       (APR_OS_START_STATUS + 15)
/* empty slot: +16 */
/* empty slot: +17 */
/* empty slot: +18 */
/** @see APR_STATUS_IS_ANONYMOUS */
#define APR_ANONYMOUS      (APR_OS_START_STATUS + 19)
/** @see APR_STATUS_IS_FILEBASED */
#define APR_FILEBASED      (APR_OS_START_STATUS + 20)
/** @see APR_STATUS_IS_KEYBASED */
#define APR_KEYBASED       (APR_OS_START_STATUS + 21)
/** @see APR_STATUS_IS_EINIT */
#define APR_EINIT          (APR_OS_START_STATUS + 22)
/** @see APR_STATUS_IS_ENOTIMPL */
#define APR_ENOTIMPL       (APR_OS_START_STATUS + 23)
/** @see APR_STATUS_IS_EMISMATCH */
#define APR_EMISMATCH      (APR_OS_START_STATUS + 24)
/** @see APR_STATUS_IS_EBUSY */
#define APR_EBUSY          (APR_OS_START_STATUS + 25)
/** @} */

/**
 * @addtogroup APR_STATUS_IS
 * @{
 */
/**
 * Program is currently executing in the child
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code */
#define APR_STATUS_IS_INCHILD(s)        ((s) == APR_INCHILD)
/**
 * Program is currently executing in the parent
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_INPARENT(s)       ((s) == APR_INPARENT)
/**
 * The thread is detached
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_DETACH(s)         ((s) == APR_DETACH)
/**
 * The thread is not detached
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_NOTDETACH(s)      ((s) == APR_NOTDETACH)
/**
 * The child has finished executing
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_CHILD_DONE(s)     ((s) == APR_CHILD_DONE)
/**
 * The child has not finished executing
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_CHILD_NOTDONE(s)  ((s) == APR_CHILD_NOTDONE)
/**
 * The operation did not finish before the timeout
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP)
/**
 * The operation was incomplete although some processing was performed
 * and the results are partially valid.
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_INCOMPLETE(s)     ((s) == APR_INCOMPLETE)
/* empty slot: +9 */
/* empty slot: +10 */
/* empty slot: +11 */
/**
 * Getopt found an option not in the option string
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_BADCH(s)          ((s) == APR_BADCH)
/**
 * Getopt found an option not in the option string and an argument was
 * specified in the option string
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_BADARG(s)         ((s) == APR_BADARG)
/**
 * APR has encountered the end of the file
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_EOF(s)            ((s) == APR_EOF)
/**
 * APR was unable to find the socket in the poll structure
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_NOTFOUND(s)       ((s) == APR_NOTFOUND)
/* empty slot: +16 */
/* empty slot: +17 */
/* empty slot: +18 */
/**
 * APR is using anonymous shared memory
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_ANONYMOUS(s)      ((s) == APR_ANONYMOUS)
/**
 * APR is using a file name as the key to the shared memory
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_FILEBASED(s)      ((s) == APR_FILEBASED)
/**
 * APR is using a shared key as the key to the shared memory
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_KEYBASED(s)       ((s) == APR_KEYBASED)
/**
 * Ininitalizer value.  If no option has been found, but
 * the status variable requires a value, this should be used
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_EINIT(s)          ((s) == APR_EINIT)
/**
 * The APR function has not been implemented on this
 * platform, either because nobody has gotten to it yet,
 * or the function is impossible on this platform.
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_ENOTIMPL(s)       ((s) == APR_ENOTIMPL)
/**
 * Two passwords do not match.
 * @warning
 * always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_EMISMATCH(s)      ((s) == APR_EMISMATCH)
/**
 * The given lock was busy
 * @warning always use this test, as platform-specific variances may meet this
 * more than one error code
 */
#define APR_STATUS_IS_EBUSY(s)          ((s) == APR_EBUSY)

/** @} */

/**
 * @addtogroup APR_Error APR Error Values
 * @{
 */
/* APR CANONICAL ERROR VALUES */
/** @see APR_STATUS_IS_EACCES */
#ifdef EACCES
#define APR_EACCES EACCES
#else
#define APR_EACCES         (APR_OS_START_CANONERR + 1)
#endif

/** @see APR_STATUS_IS_EEXIST */
#ifdef EEXIST
#define APR_EEXIST EEXIST
#else
#define APR_EEXIST         (APR_OS_START_CANONERR + 2)
#endif

/** @see APR_STATUS_IS_ENAMETOOLONG */
#ifdef ENAMETOOLONG
#define APR_ENAMETOOLONG ENAMETOOLONG
#else
#define APR_ENAMETOOLONG   (APR_OS_START_CANONERR + 3)
#endif

/** @see APR_STATUS_IS_ENOENT */
#ifdef ENOENT
#define APR_ENOENT ENOENT
#else
#define APR_ENOENT         (APR_OS_START_CANONERR + 4)
#endif

/** @see APR_STATUS_IS_ENOTDIR */
#ifdef ENOTDIR
#define APR_ENOTDIR ENOTDIR
#else
#define APR_ENOTDIR        (APR_OS_START_CANONERR + 5)
#endif

/** @see APR_STATUS_IS_ENOSPC */
#ifdef ENOSPC
#define APR_ENOSPC ENOSPC
#else
#define APR_ENOSPC         (APR_OS_START_CANONERR + 6)
#endif

/** @see APR_STATUS_IS_ENOMEM */
#ifdef ENOMEM
#define APR_ENOMEM ENOMEM
#else
#define APR_ENOMEM         (APR_OS_START_CANONERR + 7)
#endif

/** @see APR_STATUS_IS_EMFILE */
#ifdef EMFILE
#define APR_EMFILE EMFILE
#else
#define APR_EMFILE         (APR_OS_START_CANONERR + 8)
#endif

/** @see APR_STATUS_IS_ENFILE */
#ifdef ENFILE
#define APR_ENFILE ENFILE
#else
#define APR_ENFILE         (APR_OS_START_CANONERR + 9)
#endif

/** @see APR_STATUS_IS_EBADF */
#ifdef EBADF
#define APR_EBADF EBADF
#else
#define APR_EBADF          (APR_OS_START_CANONERR + 10)
#endif

/** @see APR_STATUS_IS_EINVAL */
#ifdef EINVAL
#define APR_EINVAL EINVAL
#else
#define APR_EINVAL         (APR_OS_START_CANONERR + 11)
#endif

/** @see APR_STATUS_IS_ESPIPE */
#ifdef ESPIPE
#define APR_ESPIPE ESPIPE
#else
#define APR_ESPIPE         (APR_OS_START_CANONERR + 12)
#endif

/**
 * @see APR_STATUS_IS_EAGAIN
 * @warning use APR_STATUS_IS_EAGAIN instead of just testing this value
 */
#ifdef EAGAIN
#define APR_EAGAIN EAGAIN
#elif defined(EWOULDBLOCK)
#define APR_EAGAIN EWOULDBLOCK
#else
#define APR_EAGAIN         (APR_OS_START_CANONERR + 13)
#endif

/** @see APR_STATUS_IS_EINTR */
#ifdef EINTR
#define APR_EINTR EINTR
#else
#define APR_EINTR          (APR_OS_START_CANONERR + 14)
#endif

/** @see APR_STATUS_IS_ENOTSOCK */
#ifdef ENOTSOCK
#define APR_ENOTSOCK ENOTSOCK
#else
#define APR_ENOTSOCK       (APR_OS_START_CANONERR + 15)
#endif

/** @see APR_STATUS_IS_ECONNREFUSED */
#ifdef ECONNREFUSED
#define APR_ECONNREFUSED ECONNREFUSED
#else
#define APR_ECONNREFUSED   (APR_OS_START_CANONERR + 16)
#endif

/** @see APR_STATUS_IS_EINPROGRESS */
#ifdef EINPROGRESS
#define APR_EINPROGRESS EINPROGRESS
#else
#define APR_EINPROGRESS    (APR_OS_START_CANONERR + 17)
#endif

/**
 * @see APR_STATUS_IS_ECONNABORTED
 * @warning use APR_STATUS_IS_ECONNABORTED instead of just testing this value
 */

#ifdef ECONNABORTED
#define APR_ECONNABORTED ECONNABORTED
#else
#define APR_ECONNABORTED   (APR_OS_START_CANONERR + 18)
#endif

/** @see APR_STATUS_IS_ECONNRESET */
#ifdef ECONNRESET
#define APR_ECONNRESET ECONNRESET
#else
#define APR_ECONNRESET     (APR_OS_START_CANONERR + 19)
#endif

/** @see APR_STATUS_IS_ETIMEDOUT
 *  @deprecated */
#ifdef ETIMEDOUT
#define APR_ETIMEDOUT ETIMEDOUT
#else
#define APR_ETIMEDOUT      (APR_OS_START_CANONERR + 20)
#endif

/** @see APR_STATUS_IS_EHOSTUNREACH */
#ifdef EHOSTUNREACH
#define APR_EHOSTUNREACH EHOSTUNREACH
#else
#define APR_EHOSTUNREACH   (APR_OS_START_CANONERR + 21)
#endif

/** @see APR_STATUS_IS_ENETUNREACH */
#ifdef ENETUNREACH
#define APR_ENETUNREACH ENETUNREACH
#else
#define APR_ENETUNREACH    (APR_OS_START_CANONERR + 22)
#endif

/** @see APR_STATUS_IS_EFTYPE */
#ifdef EFTYPE
#define APR_EFTYPE EFTYPE
#else
#define APR_EFTYPE        (APR_OS_START_CANONERR + 23)
#endif

/** @see APR_STATUS_IS_EPIPE */
#ifdef EPIPE
#define APR_EPIPE EPIPE
#else
#define APR_EPIPE         (APR_OS_START_CANONERR + 24)
#endif

/** @see APR_STATUS_IS_EXDEV */
#ifdef EXDEV
#define APR_EXDEV EXDEV
#else
#define APR_EXDEV         (APR_OS_START_CANONERR + 25)
#endif

/** @see APR_STATUS_IS_ENOTEMPTY */
#ifdef ENOTEMPTY
#define APR_ENOTEMPTY ENOTEMPTY
#else
#define APR_ENOTEMPTY     (APR_OS_START_CANONERR + 26)
#endif

/** @see APR_STATUS_IS_EAFNOSUPPORT */
#ifdef EAFNOSUPPORT
#define APR_EAFNOSUPPORT EAFNOSUPPORT
#else
#define APR_EAFNOSUPPORT  (APR_OS_START_CANONERR + 27)
#endif

/** @see APR_STATUS_IS_EOPNOTSUPP */
#ifdef EOPNOTSUPP
#define APR_EOPNOTSUPP EOPNOTSUPP
#else
#define APR_EOPNOTSUPP    (APR_OS_START_CANONERR + 28)
#endif

/** @see APR_STATUS_IS_ERANGE */
#ifdef ERANGE
#define APR_ERANGE ERANGE
#else
#define APR_ERANGE          (APR_OS_START_CANONERR + 29)
#endif

/** @} */

#if defined(OS2) && !defined(DOXYGEN)

#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)
#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)

#define INCL_DOSERRORS
#define INCL_DOS

/* Leave these undefined.
 * OS2 doesn't rely on the errno concept.
 * The API calls always return a result codes which
 * should be filtered through APR_FROM_OS_ERROR().
 *
 * #define apr_get_os_error()   (APR_FROM_OS_ERROR(GetLastError()))
 * #define apr_set_os_error(e)  (SetLastError(APR_TO_OS_ERROR(e)))
 */

/* A special case, only socket calls require this;
 */
#define apr_get_netos_error()   (APR_FROM_OS_ERROR(errno))
#define apr_set_netos_error(e)  (errno = APR_TO_OS_ERROR(e))

/* And this needs to be greped away for good:
 */
#define APR_OS2_STATUS(e) (APR_FROM_OS_ERROR(e))

/* These can't sit in a private header, so in spite of the extra size,
 * they need to be made available here.
 */
#define SOCBASEERR              10000
#define SOCEPERM                (SOCBASEERR+1)             /* Not owner */
#define SOCESRCH                (SOCBASEERR+3)             /* No such process */
#define SOCEINTR                (SOCBASEERR+4)             /* Interrupted system call */
#define SOCENXIO                (SOCBASEERR+6)             /* No such device or address */
#define SOCEBADF                (SOCBASEERR+9)             /* Bad file number */
#define SOCEACCES               (SOCBASEERR+13)            /* Permission denied */
#define SOCEFAULT               (SOCBASEERR+14)            /* Bad address */
#define SOCEINVAL               (SOCBASEERR+22)            /* Invalid argument */
#define SOCEMFILE               (SOCBASEERR+24)            /* Too many open files */
#define SOCEPIPE                (SOCBASEERR+32)            /* Broken pipe */
#define SOCEOS2ERR              (SOCBASEERR+100)           /* OS/2 Error */
#define SOCEWOULDBLOCK          (SOCBASEERR+35)            /* Operation would block */
#define SOCEINPROGRESS          (SOCBASEERR+36)            /* Operation now in progress */
#define SOCEALREADY             (SOCBASEERR+37)            /* Operation already in progress */
#define SOCENOTSOCK             (SOCBASEERR+38)            /* Socket operation on non-socket */
#define SOCEDESTADDRREQ         (SOCBASEERR+39)            /* Destination address required */
#define SOCEMSGSIZE             (SOCBASEERR+40)            /* Message too long */
#define SOCEPROTOTYPE           (SOCBASEERR+41)            /* Protocol wrong type for socket */
#define SOCENOPROTOOPT          (SOCBASEERR+42)            /* Protocol not available */
#define SOCEPROTONOSUPPORT      (SOCBASEERR+43)            /* Protocol not supported */
#define SOCESOCKTNOSUPPORT      (SOCBASEERR+44)            /* Socket type not supported */
#define SOCEOPNOTSUPP           (SOCBASEERR+45)            /* Operation not supported on socket */
#define SOCEPFNOSUPPORT         (SOCBASEERR+46)            /* Protocol family not supported */
#define SOCEAFNOSUPPORT         (SOCBASEERR+47)            /* Address family not supported by protocol family */
#define SOCEADDRINUSE           (SOCBASEERR+48)            /* Address already in use */
#define SOCEADDRNOTAVAIL        (SOCBASEERR+49)            /* Can't assign requested address */
#define SOCENETDOWN             (SOCBASEERR+50)            /* Network is down */
#define SOCENETUNREACH          (SOCBASEERR+51)            /* Network is unreachable */
#define SOCENETRESET            (SOCBASEERR+52)            /* Network dropped connection on reset */
#define SOCECONNABORTED         (SOCBASEERR+53)            /* Software caused connection abort */
#define SOCECONNRESET           (SOCBASEERR+54)            /* Connection reset by peer */
#define SOCENOBUFS              (SOCBASEERR+55)            /* No buffer space available */
#define SOCEISCONN              (SOCBASEERR+56)            /* Socket is already connected */
#define SOCENOTCONN             (SOCBASEERR+57)            /* Socket is not connected */
#define SOCESHUTDOWN            (SOCBASEERR+58)            /* Can't send after socket shutdown */
#define SOCETOOMANYREFS         (SOCBASEERR+59)            /* Too many references: can't splice */
#define SOCETIMEDOUT            (SOCBASEERR+60)            /* Connection timed out */
#define SOCECONNREFUSED         (SOCBASEERR+61)            /* Connection refused */
#define SOCELOOP                (SOCBASEERR+62)            /* Too many levels of symbolic links */
#define SOCENAMETOOLONG         (SOCBASEERR+63)            /* File name too long */
#define SOCEHOSTDOWN            (SOCBASEERR+64)            /* Host is down */
#define SOCEHOSTUNREACH         (SOCBASEERR+65)            /* No route to host */
#define SOCENOTEMPTY            (SOCBASEERR+66)            /* Directory not empty */

/* APR CANONICAL ERROR TESTS */
#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES \
                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \
                || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION)
#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST \
                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \
                || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \
                || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS \
                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED)
#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG \
                || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \
                || (s) == APR_OS_START_SYSERR + SOCENAMETOOLONG)
#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \
                || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \
                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \
                || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES \
                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED)
#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)
#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \
                || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL)
#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)
#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE \
                || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES)
#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)
#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE)
#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION)
#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE \
                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)
#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \
                || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \
                || (s) == APR_OS_START_SYSERR + SOCEWOULDBLOCK \
                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION)
#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \
                || (s) == APR_OS_START_SYSERR + SOCEINTR)
#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \
                || (s) == APR_OS_START_SYSERR + SOCENOTSOCK)
#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \
                || (s) == APR_OS_START_SYSERR + SOCECONNREFUSED)
#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \
                || (s) == APR_OS_START_SYSERR + SOCEINPROGRESS)
#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \
                || (s) == APR_OS_START_SYSERR + SOCECONNABORTED)
#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \
                || (s) == APR_OS_START_SYSERR + SOCECONNRESET)
/* XXX deprecated */
#define APR_STATUS_IS_ETIMEDOUT(s)         ((s) == APR_ETIMEDOUT \
                || (s) == APR_OS_START_SYSERR + SOCETIMEDOUT)
#undef APR_STATUS_IS_TIMEUP
#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \
                || (s) == APR_OS_START_SYSERR + SOCETIMEDOUT)
#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \
                || (s) == APR_OS_START_SYSERR + SOCEHOSTUNREACH)
#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \
                || (s) == APR_OS_START_SYSERR + SOCENETUNREACH)
#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE)
#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE \
                || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE \
                || (s) == APR_OS_START_SYSERR + SOCEPIPE)
#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV \
                || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE)
#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY \
                || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY \
                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED)
#define APR_STATUS_IS_EAFNOSUPPORT(s)   ((s) == APR_AFNOSUPPORT \
                || (s) == APR_OS_START_SYSERR + SOCEAFNOSUPPORT)
#define APR_STATUS_IS_EOPNOTSUPP(s)     ((s) == APR_EOPNOTSUPP \
                || (s) == APR_OS_START_SYSERR + SOCEOPNOTSUPP)
#define APR_STATUS_IS_ERANGE(s)         ((s) == APR_ERANGE)

/*
    Sorry, too tired to wrap this up for OS2... feel free to
    fit the following into their best matches.

    { ERROR_NO_SIGNAL_SENT,     ESRCH           },
    { SOCEALREADY,              EALREADY        },
    { SOCEDESTADDRREQ,          EDESTADDRREQ    },
    { SOCEMSGSIZE,              EMSGSIZE        },
    { SOCEPROTOTYPE,            EPROTOTYPE      },
    { SOCENOPROTOOPT,           ENOPROTOOPT     },
    { SOCEPROTONOSUPPORT,       EPROTONOSUPPORT },
    { SOCESOCKTNOSUPPORT,       ESOCKTNOSUPPORT },
    { SOCEPFNOSUPPORT,          EPFNOSUPPORT    },
    { SOCEADDRINUSE,            EADDRINUSE      },
    { SOCEADDRNOTAVAIL,         EADDRNOTAVAIL   },
    { SOCENETDOWN,              ENETDOWN        },
    { SOCENETRESET,             ENETRESET       },
    { SOCENOBUFS,               ENOBUFS         },
    { SOCEISCONN,               EISCONN         },
    { SOCENOTCONN,              ENOTCONN        },
    { SOCESHUTDOWN,             ESHUTDOWN       },
    { SOCETOOMANYREFS,          ETOOMANYREFS    },
    { SOCELOOP,                 ELOOP           },
    { SOCEHOSTDOWN,             EHOSTDOWN       },
    { SOCENOTEMPTY,             ENOTEMPTY       },
    { SOCEPIPE,                 EPIPE           }
*/

#elif defined(WIN32) && !defined(DOXYGEN) /* !defined(OS2) */

#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)
#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)

#define apr_get_os_error()   (APR_FROM_OS_ERROR(GetLastError()))
#define apr_set_os_error(e)  (SetLastError(APR_TO_OS_ERROR(e)))

/* A special case, only socket calls require this:
 */
#define apr_get_netos_error()   (APR_FROM_OS_ERROR(WSAGetLastError()))
#define apr_set_netos_error(e)   (WSASetLastError(APR_TO_OS_ERROR(e)))

/* APR CANONICAL ERROR TESTS */
#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES \
                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \
                || (s) == APR_OS_START_SYSERR + ERROR_CANNOT_MAKE \
                || (s) == APR_OS_START_SYSERR + ERROR_CURRENT_DIRECTORY \
                || (s) == APR_OS_START_SYSERR + ERROR_DRIVE_LOCKED \
                || (s) == APR_OS_START_SYSERR + ERROR_FAIL_I24 \
                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \
                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_FAILED \
                || (s) == APR_OS_START_SYSERR + ERROR_NOT_LOCKED \
                || (s) == APR_OS_START_SYSERR + ERROR_NETWORK_ACCESS_DENIED \
                || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION)
#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST \
                || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \
                || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS)
#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG \
                || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \
                || (s) == APR_OS_START_SYSERR + WSAENAMETOOLONG)
#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \
                || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \
                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \
                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \
                || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES)
#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR \
                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \
                || (s) == APR_OS_START_SYSERR + ERROR_BAD_NETPATH \
                || (s) == APR_OS_START_SYSERR + ERROR_BAD_NET_NAME \
                || (s) == APR_OS_START_SYSERR + ERROR_BAD_PATHNAME \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DRIVE \
                || (s) == APR_OS_START_SYSERR + ERROR_DIRECTORY)
#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \
                || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL)
#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM \
                || (s) == APR_OS_START_SYSERR + ERROR_ARENA_TRASHED \
                || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_MEMORY \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_BLOCK \
                || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_QUOTA \
                || (s) == APR_OS_START_SYSERR + ERROR_OUTOFMEMORY)
#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE \
                || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES)
#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)
#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_TARGET_HANDLE)
#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_ACCESS \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DATA \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \
                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)
#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE \
                || (s) == APR_OS_START_SYSERR + ERROR_SEEK_ON_DEVICE \
                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)
#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \
                || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \
                || (s) == APR_OS_START_SYSERR + ERROR_NO_PROC_SLOTS \
                || (s) == APR_OS_START_SYSERR + ERROR_NESTING_NOT_ALLOWED \
                || (s) == APR_OS_START_SYSERR + ERROR_MAX_THRDS_REACHED \
                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \
                || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK)
#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \
                || (s) == APR_OS_START_SYSERR + WSAEINTR)
#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \
                || (s) == APR_OS_START_SYSERR + WSAENOTSOCK)
#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \
                || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED)
#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \
                || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS)
#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \
                || (s) == APR_OS_START_SYSERR + WSAECONNABORTED)
#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \
                || (s) == APR_OS_START_SYSERR + ERROR_NETNAME_DELETED \
                || (s) == APR_OS_START_SYSERR + WSAECONNRESET)
/* XXX deprecated */
#define APR_STATUS_IS_ETIMEDOUT(s)         ((s) == APR_ETIMEDOUT \
                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \
                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)
#undef APR_STATUS_IS_TIMEUP
#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \
                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \
                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)
#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \
                || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH)
#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \
                || (s) == APR_OS_START_SYSERR + WSAENETUNREACH)
#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE \
                || (s) == APR_OS_START_SYSERR + ERROR_EXE_MACHINE_TYPE_MISMATCH \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DLL \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_MODULETYPE \
                || (s) == APR_OS_START_SYSERR + ERROR_BAD_EXE_FORMAT \
                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_EXE_SIGNATURE \
                || (s) == APR_OS_START_SYSERR + ERROR_FILE_CORRUPT \
                || (s) == APR_OS_START_SYSERR + ERROR_BAD_FORMAT)
#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE \
                || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE)
#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV \
                || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE)
#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY \
                || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY)
#define APR_STATUS_IS_EAFNOSUPPORT(s)   ((s) == APR_EAFNOSUPPORT \
                || (s) == APR_OS_START_SYSERR + WSAEAFNOSUPPORT)
#define APR_STATUS_IS_EOPNOTSUPP(s)     ((s) == APR_EOPNOTSUPP \
                || (s) == APR_OS_START_SYSERR + WSAEOPNOTSUPP)
#define APR_STATUS_IS_ERANGE(s)         ((s) == APR_ERANGE)

#elif defined(NETWARE) && defined(USE_WINSOCK) && !defined(DOXYGEN) /* !defined(OS2) && !defined(WIN32) */

#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)
#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)

#define apr_get_os_error()    (errno)
#define apr_set_os_error(e)   (errno = (e))

/* A special case, only socket calls require this: */
#define apr_get_netos_error()   (APR_FROM_OS_ERROR(WSAGetLastError()))
#define apr_set_netos_error(e)  (WSASetLastError(APR_TO_OS_ERROR(e)))

/* APR CANONICAL ERROR TESTS */
#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES)
#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST)
#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG)
#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT)
#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)
#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC)
#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)
#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE)
#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)
#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF)
#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL)
#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE)

#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \
                || (s) ==                       EWOULDBLOCK \
                || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK)
#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \
                || (s) == APR_OS_START_SYSERR + WSAEINTR)
#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \
                || (s) == APR_OS_START_SYSERR + WSAENOTSOCK)
#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \
                || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED)
#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \
                || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS)
#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \
                || (s) == APR_OS_START_SYSERR + WSAECONNABORTED)
#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \
                || (s) == APR_OS_START_SYSERR + WSAECONNRESET)
/* XXX deprecated */
#define APR_STATUS_IS_ETIMEDOUT(s)       ((s) == APR_ETIMEDOUT \
                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \
                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)
#undef APR_STATUS_IS_TIMEUP
#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \
                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \
                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)
#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \
                || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH)
#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \
                || (s) == APR_OS_START_SYSERR + WSAENETUNREACH)
#define APR_STATUS_IS_ENETDOWN(s)       ((s) == APR_OS_START_SYSERR + WSAENETDOWN)
#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE)
#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE)
#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV)
#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY)
#define APR_STATUS_IS_EAFNOSUPPORT(s)   ((s) == APR_EAFNOSUPPORT \
                || (s) == APR_OS_START_SYSERR + WSAEAFNOSUPPORT)
#define APR_STATUS_IS_EOPNOTSUPP(s)     ((s) == APR_EOPNOTSUPP \
                || (s) == APR_OS_START_SYSERR + WSAEOPNOTSUPP)
#define APR_STATUS_IS_ERANGE(s)         ((s) == APR_ERANGE)

#else /* !defined(NETWARE) && !defined(OS2) && !defined(WIN32) */

/*
 *  os error codes are clib error codes
 */
#define APR_FROM_OS_ERROR(e)  (e)
#define APR_TO_OS_ERROR(e)    (e)

#define apr_get_os_error()    (errno)
#define apr_set_os_error(e)   (errno = (e))

/* A special case, only socket calls require this:
 */
#define apr_get_netos_error() (errno)
#define apr_set_netos_error(e) (errno = (e))

/**
 * @addtogroup APR_STATUS_IS
 * @{
 */

/** permission denied */
#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES)
/** file exists */
#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST)
/** path name is too long */
#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG)
/**
 * no such file or directory
 * @remark
 * EMVSCATLG can be returned by the automounter on z/OS for
 * paths which do not exist.
 */
#ifdef EMVSCATLG
#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \
                                      || (s) == EMVSCATLG)
#else
#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT)
#endif
/** not a directory */
#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)
/** no space left on device */
#ifdef EDQUOT
#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \
                                      || (s) == EDQUOT)
#else
#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC)
#endif
/** not enough memory */
#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)
/** too many open files */
#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE)
/** file table overflow */
#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)
/** bad file # */
#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF)
/** invalid argument */
#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL)
/** illegal seek */
#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE)

/** operation would block */
#if !defined(EWOULDBLOCK) || !defined(EAGAIN)
#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN)
#elif (EWOULDBLOCK == EAGAIN)
#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN)
#else
#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \
                                      || (s) == EWOULDBLOCK)
#endif

/** interrupted system call */
#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR)
/** socket operation on a non-socket */
#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK)
/** Connection Refused */
#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED)
/** operation now in progress */
#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS)

/**
 * Software caused connection abort
 * @remark
 * EPROTO on certain older kernels really means ECONNABORTED, so we need to
 * ignore it for them.  See discussion in new-httpd archives nh.9701 & nh.9603
 *
 * There is potentially a bug in Solaris 2.x x<6, and other boxes that
 * implement tcp sockets in userland (i.e. on top of STREAMS).  On these
 * systems, EPROTO can actually result in a fatal loop.  See PR#981 for
 * example.  It's hard to handle both uses of EPROTO.
 */
#ifdef EPROTO
#define APR_STATUS_IS_ECONNABORTED(s)    ((s) == APR_ECONNABORTED \
                                       || (s) == EPROTO)
#else
#define APR_STATUS_IS_ECONNABORTED(s)    ((s) == APR_ECONNABORTED)
#endif

/** Connection Reset by peer */
#define APR_STATUS_IS_ECONNRESET(s)      ((s) == APR_ECONNRESET)
/** Operation timed out
 *  @deprecated */
#define APR_STATUS_IS_ETIMEDOUT(s)      ((s) == APR_ETIMEDOUT)
/** no route to host */
#define APR_STATUS_IS_EHOSTUNREACH(s)    ((s) == APR_EHOSTUNREACH)
/** network is unreachable */
#define APR_STATUS_IS_ENETUNREACH(s)     ((s) == APR_ENETUNREACH)
/** inappropriate file type or format */
#define APR_STATUS_IS_EFTYPE(s)          ((s) == APR_EFTYPE)
/** broken pipe */
#define APR_STATUS_IS_EPIPE(s)           ((s) == APR_EPIPE)
/** cross device link */
#define APR_STATUS_IS_EXDEV(s)           ((s) == APR_EXDEV)
/** Directory Not Empty */
#define APR_STATUS_IS_ENOTEMPTY(s)       ((s) == APR_ENOTEMPTY || \
                                          (s) == APR_EEXIST)
/** Address Family not supported */
#define APR_STATUS_IS_EAFNOSUPPORT(s)    ((s) == APR_EAFNOSUPPORT)
/** Socket operation not supported */
#define APR_STATUS_IS_EOPNOTSUPP(s)      ((s) == APR_EOPNOTSUPP)

/** Numeric value not representable */
#define APR_STATUS_IS_ERANGE(s)         ((s) == APR_ERANGE)
/** @} */

#endif /* !defined(NETWARE) && !defined(OS2) && !defined(WIN32) */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_ERRNO_H */
include/apr-1/apr_uuid.h000064400000004066150336140420011074 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file apr_uuid.h
 * @brief APR UUID library
 */
#ifndef APR_UUID_H
#define APR_UUID_H

#include "apu.h"
#include "apr_errno.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup APR_UUID UUID Handling
 * @ingroup APR
 * @{
 */

/**
 * we represent a UUID as a block of 16 bytes.
 */

typedef struct {
    unsigned char data[16]; /**< the actual UUID */
} apr_uuid_t;

/** UUIDs are formatted as: 00112233-4455-6677-8899-AABBCCDDEEFF */
#define APR_UUID_FORMATTED_LENGTH 36


/**
 * Generate and return a (new) UUID
 * @param uuid The resulting UUID
 */ 
APU_DECLARE(void) apr_uuid_get(apr_uuid_t *uuid);

/**
 * Format a UUID into a string, following the standard format
 * @param buffer The buffer to place the formatted UUID string into. It must
 *               be at least APR_UUID_FORMATTED_LENGTH + 1 bytes long to hold
 *               the formatted UUID and a null terminator
 * @param uuid The UUID to format
 */ 
APU_DECLARE(void) apr_uuid_format(char *buffer, const apr_uuid_t *uuid);

/**
 * Parse a standard-format string into a UUID
 * @param uuid The resulting UUID
 * @param uuid_str The formatted UUID
 */ 
APU_DECLARE(apr_status_t) apr_uuid_parse(apr_uuid_t *uuid, const char *uuid_str);

/** @} */
#ifdef __cplusplus
}
#endif

#endif /* APR_UUID_H */
include/apr-1/apr_getopt.h000064400000013534150336140420011430 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_GETOPT_H
#define APR_GETOPT_H

/**
 * @file apr_getopt.h
 * @brief APR Command Arguments (getopt)
 */

#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_getopt Command Argument Parsing
 * @ingroup APR 
 * @{
 */

/** 
 * An @c apr_getopt_t error callback function.
 *
 * @a arg is this @c apr_getopt_t's @c errarg member.
 */
typedef void (apr_getopt_err_fn_t)(void *arg, const char *err, ...);

/** @see apr_getopt_t */
typedef struct apr_getopt_t apr_getopt_t;

/**
 * Structure to store command line argument information.
 */ 
struct apr_getopt_t {
    /** context for processing */
    apr_pool_t *cont;
    /** function to print error message (NULL == no messages) */
    apr_getopt_err_fn_t *errfn;
    /** user defined first arg to pass to error message  */
    void *errarg;
    /** index into parent argv vector */
    int ind;
    /** character checked for validity */
    int opt;
    /** reset getopt */
    int reset;
    /** count of arguments */
    int argc;
    /** array of pointers to arguments */
    const char **argv;
    /** argument associated with option */
    char const* place;
    /** set to nonzero to support interleaving options with regular args */
    int interleave;
    /** start of non-option arguments skipped for interleaving */
    int skip_start;
    /** end of non-option arguments skipped for interleaving */
    int skip_end;
};

/** @see apr_getopt_option_t */
typedef struct apr_getopt_option_t apr_getopt_option_t;

/**
 * Structure used to describe options that getopt should search for.
 */
struct apr_getopt_option_t {
    /** long option name, or NULL if option has no long name */
    const char *name;
    /** option letter, or a value greater than 255 if option has no letter */
    int optch;
    /** nonzero if option takes an argument */
    int has_arg;
    /** a description of the option */
    const char *description;
};

/**
 * Initialize the arguments for parsing by apr_getopt().
 * @param os   The options structure created for apr_getopt()
 * @param cont The pool to operate on
 * @param argc The number of arguments to parse
 * @param argv The array of arguments to parse
 * @remark Arguments 3 and 4 are most commonly argc and argv from main(argc, argv)
 * The (*os)->errfn is initialized to fprintf(stderr... but may be overridden.
 */
APR_DECLARE(apr_status_t) apr_getopt_init(apr_getopt_t **os, apr_pool_t *cont,
                                      int argc, const char * const *argv);

/**
 * Parse the options initialized by apr_getopt_init().
 * @param os     The apr_opt_t structure returned by apr_getopt_init()
 * @param opts   A string of characters that are acceptable options to the 
 *               program.  Characters followed by ":" are required to have an 
 *               option associated
 * @param option_ch  The next option character parsed
 * @param option_arg The argument following the option character:
 * @return There are four potential status values on exit. They are:
 * <PRE>
 *             APR_EOF      --  No more options to parse
 *             APR_BADCH    --  Found a bad option character
 *             APR_BADARG   --  No argument followed the option flag
 *             APR_SUCCESS  --  The next option was found.
 * </PRE>
 */
APR_DECLARE(apr_status_t) apr_getopt(apr_getopt_t *os, const char *opts, 
                                     char *option_ch, const char **option_arg);

/**
 * Parse the options initialized by apr_getopt_init(), accepting long
 * options beginning with "--" in addition to single-character
 * options beginning with "-".
 * @param os     The apr_getopt_t structure created by apr_getopt_init()
 * @param opts   A pointer to a list of apr_getopt_option_t structures, which
 *               can be initialized with { "name", optch, has_args }.  has_args
 *               is nonzero if the option requires an argument.  A structure
 *               with an optch value of 0 terminates the list.
 * @param option_ch  Receives the value of "optch" from the apr_getopt_option_t
 *                   structure corresponding to the next option matched.
 * @param option_arg Receives the argument following the option, if any.
 * @return There are four potential status values on exit.   They are:
 * <PRE>
 *             APR_EOF      --  No more options to parse
 *             APR_BADCH    --  Found a bad option character
 *             APR_BADARG   --  No argument followed the option flag
 *             APR_SUCCESS  --  The next option was found.
 * </PRE>
 * When APR_SUCCESS is returned, os->ind gives the index of the first
 * non-option argument.  On error, a message will be printed to stdout unless
 * os->err is set to 0.  If os->interleave is set to nonzero, options can come
 * after arguments, and os->argv will be permuted to leave non-option arguments
 * at the end (the original argv is unaffected).
 */
APR_DECLARE(apr_status_t) apr_getopt_long(apr_getopt_t *os,
					  const apr_getopt_option_t *opts,
					  int *option_ch,
                                          const char **option_arg);
/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_GETOPT_H */
include/apr-1/apr_strmatch.h000064400000005165150336140420011754 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_STRMATCH_H
#define APR_STRMATCH_H
/**
 * @file apr_strmatch.h
 * @brief APR-UTIL string matching routines
 */

#include "apu.h"
#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup APR_Util_StrMatch String matching routines
 * @ingroup APR_Util
 * @{
 */

/** @see apr_strmatch_pattern */
typedef struct apr_strmatch_pattern apr_strmatch_pattern;

/**
 * Precompiled search pattern
 */
struct apr_strmatch_pattern {
    /** Function called to compare */
    const char *(*compare)(const apr_strmatch_pattern *this_pattern,
                           const char *s, apr_size_t slen);
    const char *pattern;    /**< Current pattern */
    apr_size_t length;      /**< Current length */
    void *context;          /**< hook to add precomputed metadata */
};

#if defined(DOXYGEN)
/**
 * Search for a precompiled pattern within a string
 * @param pattern The pattern
 * @param s The string in which to search for the pattern
 * @param slen The length of s (excluding null terminator)
 * @return A pointer to the first instance of the pattern in s, or
 *         NULL if not found
 */
APU_DECLARE(const char *) apr_strmatch(const apr_strmatch_pattern *pattern,
                                       const char *s, apr_size_t slen);
#else
#define apr_strmatch(pattern, s, slen) (*((pattern)->compare))((pattern), (s), (slen))
#endif

/**
 * Precompile a pattern for matching using the Boyer-Moore-Horspool algorithm
 * @param p The pool from which to allocate the pattern
 * @param s The pattern string
 * @param case_sensitive Whether the matching should be case-sensitive
 * @return a pointer to the compiled pattern, or NULL if compilation fails
 */
APU_DECLARE(const apr_strmatch_pattern *) apr_strmatch_precompile(apr_pool_t *p, const char *s, int case_sensitive);

/** @} */
#ifdef __cplusplus
}
#endif

#endif	/* !APR_STRMATCH_H */
include/apr-1/apr_proc_mutex.h000064400000015544150336140420012316 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_PROC_MUTEX_H
#define APR_PROC_MUTEX_H

/**
 * @file apr_proc_mutex.h
 * @brief APR Process Locking Routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_perms_set.h"
#include "apr_time.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_proc_mutex Process Locking Routines
 * @ingroup APR 
 * @{
 */

/** 
 * Enumerated potential types for APR process locking methods
 * @warning Check APR_HAS_foo_SERIALIZE defines to see if the platform supports
 *          APR_LOCK_foo.  Only APR_LOCK_DEFAULT is portable.
 */
typedef enum {
    APR_LOCK_FCNTL,         /**< fcntl() */
    APR_LOCK_FLOCK,         /**< flock() */
    APR_LOCK_SYSVSEM,       /**< System V Semaphores */
    APR_LOCK_PROC_PTHREAD,  /**< POSIX pthread process-based locking */
    APR_LOCK_POSIXSEM,      /**< POSIX semaphore process-based locking */
    APR_LOCK_DEFAULT,       /**< Use the default process lock */
    APR_LOCK_DEFAULT_TIMED  /**< Use the default process timed lock */
} apr_lockmech_e;

/** Opaque structure representing a process mutex. */
typedef struct apr_proc_mutex_t apr_proc_mutex_t;

/*   Function definitions */

/**
 * Create and initialize a mutex that can be used to synchronize processes.
 * @param mutex the memory address where the newly created mutex will be
 *        stored.
 * @param fname A file name to use if the lock mechanism requires one.  This
 *        argument should always be provided.  The lock code itself will
 *        determine if it should be used.
 * @param mech The mechanism to use for the interprocess lock, if any; one of
 * <PRE>
 *            APR_LOCK_FCNTL
 *            APR_LOCK_FLOCK
 *            APR_LOCK_SYSVSEM
 *            APR_LOCK_POSIXSEM
 *            APR_LOCK_PROC_PTHREAD
 *            APR_LOCK_DEFAULT     pick the default mechanism for the platform
 * </PRE>
 * @param pool the pool from which to allocate the mutex.
 * @see apr_lockmech_e
 * @warning Check APR_HAS_foo_SERIALIZE defines to see if the platform supports
 *          APR_LOCK_foo.  Only APR_LOCK_DEFAULT is portable.
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex,
                                                const char *fname,
                                                apr_lockmech_e mech,
                                                apr_pool_t *pool);

/**
 * Re-open a mutex in a child process.
 * @param mutex The newly re-opened mutex structure.
 * @param fname A file name to use if the mutex mechanism requires one.  This
 *              argument should always be provided.  The mutex code itself will
 *              determine if it should be used.  This filename should be the 
 *              same one that was passed to apr_proc_mutex_create().
 * @param pool The pool to operate on.
 * @remark This function must be called to maintain portability, even
 *         if the underlying lock mechanism does not require it.
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex,
                                                    const char *fname,
                                                    apr_pool_t *pool);

/**
 * Acquire the lock for the given mutex. If the mutex is already locked,
 * the current thread will be put to sleep until the lock becomes available.
 * @param mutex the mutex on which to acquire the lock.
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex);

/**
 * Attempt to acquire the lock for the given mutex. If the mutex has already
 * been acquired, the call returns immediately with APR_EBUSY. Note: it
 * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine
 * if the return value was APR_EBUSY, for portability reasons.
 * @param mutex the mutex on which to attempt the lock acquiring.
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex);

/**
 * Attempt to acquire the lock for the given mutex until timeout expires.
 * If the acquisition time outs, the call returns with APR_TIMEUP.
 * @param mutex the mutex on which to attempt the lock acquiring.
 * @param timeout the relative timeout (microseconds).
 * @note A negative or nul timeout means immediate attempt, returning
 *       APR_TIMEUP without blocking if it the lock is already acquired.
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_timedlock(apr_proc_mutex_t *mutex,
                                               apr_interval_time_t timeout);

/**
 * Release the lock for the given mutex.
 * @param mutex the mutex from which to release the lock.
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex);

/**
 * Destroy the mutex and free the memory associated with the lock.
 * @param mutex the mutex to destroy.
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex);

/**
 * Destroy the mutex and free the memory associated with the lock.
 * @param mutex the mutex to destroy.
 * @note This function is generally used to kill a cleanup on an already
 *       created mutex
 */
APR_DECLARE(apr_status_t) apr_proc_mutex_cleanup(void *mutex);

/**
 * Return the name of the lockfile for the mutex, or NULL
 * if the mutex doesn't use a lock file
 */

APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex);

/**
 * Get the mechanism of the mutex, as it relates to the actual method
 * used for the underlying apr_proc_mutex_t.
 * @param mutex the mutex to get the mechanism from.
 */
APR_DECLARE(apr_lockmech_e) apr_proc_mutex_mech(apr_proc_mutex_t *mutex);

/**
 * Get the mechanism's name of the mutex, as it relates to the actual method
 * used for the underlying apr_proc_mutex_t.
 * @param mutex the mutex to get the mechanism's name from.
 */
APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex);

/**
 * Display the name of the default mutex: APR_LOCK_DEFAULT
 */
APR_DECLARE(const char *) apr_proc_mutex_defname(void);

/**
 * Set mutex permissions.
 */
APR_PERMS_SET_IMPLEMENT(proc_mutex);

/**
 * Get the pool used by this proc_mutex.
 * @return apr_pool_t the pool
 */
APR_POOL_DECLARE_ACCESSOR(proc_mutex);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_PROC_MUTEX_H */
include/apr-1/apr_reslist.h000064400000016010150336140420011603 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_RESLIST_H
#define APR_RESLIST_H

/** 
 * @file apr_reslist.h
 * @brief APR-UTIL Resource List Routines
 */

#include "apr.h"
#include "apu.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_time.h"

/**
 * @defgroup APR_Util_RL Resource List Routines
 * @ingroup APR_Util
 * @{
 */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/** Opaque resource list object */
typedef struct apr_reslist_t apr_reslist_t;

/* Generic constructor called by resource list when it needs to create a
 * resource.
 * @param resource opaque resource
 * @param params flags
 * @param pool  Pool
 */
typedef apr_status_t (*apr_reslist_constructor)(void **resource, void *params,
                                                apr_pool_t *pool);

/* Generic destructor called by resource list when it needs to destroy a
 * resource.
 * @param resource opaque resource
 * @param params flags
 * @param pool  Pool
 */
typedef apr_status_t (*apr_reslist_destructor)(void *resource, void *params,
                                               apr_pool_t *pool);

/* Cleanup order modes */
#define APR_RESLIST_CLEANUP_DEFAULT  0       /**< default pool cleanup */
#define APR_RESLIST_CLEANUP_FIRST    1       /**< use pool pre cleanup */

/**
 * Create a new resource list with the following parameters:
 * @param reslist An address where the pointer to the new resource
 *                list will be stored.
 * @param min Allowed minimum number of available resources. Zero
 *            creates new resources only when needed.
 * @param smax Resources will be destroyed during reslist maintenance to
 *             meet this maximum restriction as they expire (reach their ttl).
 * @param hmax Absolute maximum limit on the number of total resources.
 * @param ttl If non-zero, sets the maximum amount of time in microseconds an
 *            unused resource is valid.  Any resource which has exceeded this
 *            time will be destroyed, either when encountered by
 *            apr_reslist_acquire() or during reslist maintenance.
 * @param con Constructor routine that is called to create a new resource.
 * @param de Destructor routine that is called to destroy an expired resource.
 * @param params Passed to constructor and deconstructor
 * @param pool The pool from which to create this resource list. Also the
 *             same pool that is passed to the constructor and destructor
 *             routines.
 * @remark If APR has been compiled without thread support, hmax will be
 *         automatically set to 1 and values of min and smax will be forced to
 *         1 for any non-zero value.
 */
APU_DECLARE(apr_status_t) apr_reslist_create(apr_reslist_t **reslist,
                                             int min, int smax, int hmax,
                                             apr_interval_time_t ttl,
                                             apr_reslist_constructor con,
                                             apr_reslist_destructor de,
                                             void *params,
                                             apr_pool_t *pool);

/**
 * Destroy the given resource list and all resources controlled by
 * this list.
 * FIXME: Should this block until all resources become available,
 *        or maybe just destroy all the free ones, or maybe destroy
 *        them even though they might be in use by something else?
 *        Currently it will abort if there are resources that haven't
 *        been released, so there is an assumption that all resources
 *        have been released to the list before calling this function.
 * @param reslist The reslist to destroy
 */
APU_DECLARE(apr_status_t) apr_reslist_destroy(apr_reslist_t *reslist);

/**
 * Retrieve a resource from the list, creating a new one if necessary.
 * If we have met our maximum number of resources, we will block
 * until one becomes available.
 * @param reslist The resource list.
 * @param resource An address where the pointer to the resource
 *                will be stored.
 */
APU_DECLARE(apr_status_t) apr_reslist_acquire(apr_reslist_t *reslist,
                                              void **resource);

/**
 * Return a resource back to the list of available resources.
 * @param reslist The resource list.
 * @param resource The resource to return to the list.
 */
APU_DECLARE(apr_status_t) apr_reslist_release(apr_reslist_t *reslist,
                                              void *resource);

/**
 * Set the timeout the acquire will wait for a free resource
 * when the maximum number of resources is exceeded.
 * @param reslist The resource list.
 * @param timeout Timeout to wait. The zero waits forever.
 */
APU_DECLARE(void) apr_reslist_timeout_set(apr_reslist_t *reslist,
                                          apr_interval_time_t timeout);

/**
 * Return the number of outstanding resources.
 * @param reslist The resource list.
 */
APU_DECLARE(apr_uint32_t) apr_reslist_acquired_count(apr_reslist_t *reslist);

/**
 * Invalidate a resource in the pool - e.g. a database connection
 * that returns a "lost connection" error and can't be restored.
 * Use this instead of apr_reslist_release if the resource is bad.
 * @param reslist The resource list.
 * @param resource The resource to invalidate.
 */
APU_DECLARE(apr_status_t) apr_reslist_invalidate(apr_reslist_t *reslist,
                                                 void *resource);

/**
 * Perform routine maintenance on the resource list. This call
 * may instantiate new resources or expire old resources.
 * @param reslist The resource list.
 */
APU_DECLARE(apr_status_t) apr_reslist_maintain(apr_reslist_t *reslist);

/**
 * Set reslist cleanup order.
 * @param reslist The resource list.
 * @param mode Cleanup order mode
 * <PRE>
 *           APR_RESLIST_CLEANUP_DEFAULT  default pool cleanup order
 *           APR_RESLIST_CLEANUP_FIRST    use pool pre cleanup
 * </PRE>
 * @remark If APR_RESLIST_CLEANUP_FIRST is used the destructors will
 * be called before child pools of the pool used to create the reslist
 * are destroyed. This allows to explicitly destroy the child pools
 * inside reslist destructors.
 */
APU_DECLARE(void) apr_reslist_cleanup_order_set(apr_reslist_t *reslist,
                                                apr_uint32_t mode);

#ifdef __cplusplus
}
#endif

/** @} */

#endif  /* ! APR_RESLIST_H */
include/apr-1/apr_siphash.h000064400000014016150336140420011561 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
   SipHash reference C implementation
   Copyright (c) 2012-2014 Jean-Philippe Aumasson
   <jeanphilippe.aumasson@gmail.com>
   Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to>
   To the extent possible under law, the author(s) have dedicated all copyright
   and related and neighboring rights to this software to the public domain
   worldwide. This software is distributed without any warranty.
   You should have received a copy of the CC0 Public Domain Dedication along
   with this software. If not, see
   <http://creativecommons.org/publicdomain/zero/1.0/>.
 */

#ifndef APR_SIPHASH_H
#define APR_SIPHASH_H

#include "apr.h"
#include "apu.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @file apr_siphash.h
 * @brief APR-UTIL siphash library
 *        "SipHash-c-d is a family of pseudorandom functions (a.k.a. keyed
 *        hash functions) optimized for speed on short messages", designed by
 *        Jean-Philippe Aumasson and Daniel J. Bernstein. It generates a 64bit
 *        hash (or MAC) from the message and a 128bit key.
 *        See http://cr.yp.to/siphash/siphash-20120620.pdf for the details,
 *        c is the number of compression rounds, d the number of finalization
 *        rounds; we also define fast implementations for c = 2 with d = 4 (aka
 *        siphash-2-4), and c = 4 with d = 8 (aka siphash-4-8), as recommended
 *        parameters per the authors.
 */

/** size of the siphash digest */
#define APR_SIPHASH_DSIZE 8

/** size of the siphash key */
#define APR_SIPHASH_KSIZE 16


/**
 * @brief Computes SipHash-c-d, producing a 64bit (APR_SIPHASH_DSIZE) hash
 * from a message and a 128bit (APR_SIPHASH_KSIZE) secret key.
 * @param src The message
 * @param len The length of the message
 * @param key The secret key
 * @param c   The number of compression rounds
 * @param d   The number of finalization rounds
 * @return The hash value as a 64bit unsigned integer
 */
APU_DECLARE(apr_uint64_t) apr_siphash(const void *src, apr_size_t len,
                              const unsigned char key[APR_SIPHASH_KSIZE],
                                      unsigned int c, unsigned int d);

/**
 * @brief Computes SipHash-c-d, producing a 64bit (APR_SIPHASH_DSIZE) hash
 * from a message and a 128bit (APR_SIPHASH_KSIZE) secret key, into a possibly
 * unaligned buffer (using the little endian representation as defined by the
 * authors for interoperabilty) usable as a MAC.
 * @param out The output buffer (or MAC)
 * @param src The message
 * @param len The length of the message
 * @param key The secret key
 * @param c   The number of compression rounds
 * @param d   The number of finalization rounds
 * @return The hash value as a 64bit unsigned integer
 */
APU_DECLARE(void) apr_siphash_auth(unsigned char out[APR_SIPHASH_DSIZE],
                                   const void *src, apr_size_t len,
                             const unsigned char key[APR_SIPHASH_KSIZE],
                                   unsigned int c, unsigned int d);

/**
 * @brief Computes SipHash-2-4, producing a 64bit (APR_SIPHASH_DSIZE) hash
 * from a message and a 128bit (APR_SIPHASH_KSIZE) secret key.
 * @param src The message to hash
 * @param len The length of the message
 * @param key The secret key
 * @return The hash value as a 64bit unsigned integer
 */
APU_DECLARE(apr_uint64_t) apr_siphash24(const void *src, apr_size_t len,
                               const unsigned char key[APR_SIPHASH_KSIZE]);

/**
 * @brief Computes SipHash-2-4, producing a 64bit (APR_SIPHASH_DSIZE) hash
 * from a message and a 128bit (APR_SIPHASH_KSIZE) secret key, into a possibly
 * unaligned buffer (using the little endian representation as defined by the
 * authors for interoperabilty) usable as a MAC.
 * @param out The output buffer (or MAC)
 * @param src The message
 * @param len The length of the message
 * @param key The secret key
 * @return The hash value as a 64bit unsigned integer
 */
APU_DECLARE(void) apr_siphash24_auth(unsigned char out[APR_SIPHASH_DSIZE],
                                     const void *src, apr_size_t len,
                               const unsigned char key[APR_SIPHASH_KSIZE]);

/**
 * @brief Computes SipHash-4-8, producing a 64bit (APR_SIPHASH_DSIZE) hash
 * from a message and a 128bit (APR_SIPHASH_KSIZE) secret key.
 * @param src The message
 * @param len The length of the message
 * @param key The secret key
 * @return The hash value as a 64bit unsigned integer
 */
APU_DECLARE(apr_uint64_t) apr_siphash48(const void *src, apr_size_t len,
                               const unsigned char key[APR_SIPHASH_KSIZE]);

/**
 * @brief Computes SipHash-4-8, producing a 64bit (APR_SIPHASH_DSIZE) hash
 * from a message and a 128bit (APR_SIPHASH_KSIZE) secret key, into a possibly
 * unaligned buffer (using the little endian representation as defined by the
 * authors for interoperabilty) usable as a MAC.
 * @param out The output buffer (or MAC)
 * @param src The message
 * @param len The length of the message
 * @param key The secret key
 * @return The hash value as a 64bit unsigned integer
 */
APU_DECLARE(void) apr_siphash48_auth(unsigned char out[APR_SIPHASH_DSIZE],
                                     const void *src, apr_size_t len,
                               const unsigned char key[APR_SIPHASH_KSIZE]);

#ifdef __cplusplus
}
#endif

#endif  /* APR_SIPHASH_H */
include/apr-1/apr_file_info.h000064400000042260150336140420012056 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_FILE_INFO_H
#define APR_FILE_INFO_H

/**
 * @file apr_file_info.h
 * @brief APR File Information
 */

#include "apr.h"
#include "apr_user.h"
#include "apr_pools.h"
#include "apr_tables.h"
#include "apr_time.h"
#include "apr_errno.h"

#if APR_HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_file_info File Information
 * @ingroup APR 
 * @{
 */

/* Many applications use the type member to determine the
 * existance of a file or initialization of the file info,
 * so the APR_NOFILE value must be distinct from APR_UNKFILE.
 */

/** apr_filetype_e values for the filetype member of the 
 * apr_file_info_t structure
 * @warning Not all of the filetypes below can be determined.
 * For example, a given platform might not correctly report 
 * a socket descriptor as APR_SOCK if that type isn't 
 * well-identified on that platform.  In such cases where
 * a filetype exists but cannot be described by the recognized
 * flags below, the filetype will be APR_UNKFILE.  If the
 * filetype member is not determined, the type will be APR_NOFILE.
 */

typedef enum {
    APR_NOFILE = 0,     /**< no file type determined */
    APR_REG,            /**< a regular file */
    APR_DIR,            /**< a directory */
    APR_CHR,            /**< a character device */
    APR_BLK,            /**< a block device */
    APR_PIPE,           /**< a FIFO / pipe */
    APR_LNK,            /**< a symbolic link */
    APR_SOCK,           /**< a [unix domain] socket */
    APR_UNKFILE = 127   /**< a file of some other unknown type */
} apr_filetype_e; 

/**
 * @defgroup apr_file_permissions File Permissions flags 
 * @{
 */

#define APR_FPROT_USETID      0x8000 /**< Set user id */
#define APR_FPROT_UREAD       0x0400 /**< Read by user */
#define APR_FPROT_UWRITE      0x0200 /**< Write by user */
#define APR_FPROT_UEXECUTE    0x0100 /**< Execute by user */

#define APR_FPROT_GSETID      0x4000 /**< Set group id */
#define APR_FPROT_GREAD       0x0040 /**< Read by group */
#define APR_FPROT_GWRITE      0x0020 /**< Write by group */
#define APR_FPROT_GEXECUTE    0x0010 /**< Execute by group */

#define APR_FPROT_WSTICKY     0x2000 /**< Sticky bit */
#define APR_FPROT_WREAD       0x0004 /**< Read by others */
#define APR_FPROT_WWRITE      0x0002 /**< Write by others */
#define APR_FPROT_WEXECUTE    0x0001 /**< Execute by others */

#define APR_FPROT_OS_DEFAULT  0x0FFF /**< use OS's default permissions */

/* additional permission flags for apr_file_copy  and apr_file_append */
#define APR_FPROT_FILE_SOURCE_PERMS 0x1000 /**< Copy source file's permissions */
    
/* backcompat */
#define APR_USETID     APR_FPROT_USETID     /**< @deprecated @see APR_FPROT_USETID     */
#define APR_UREAD      APR_FPROT_UREAD      /**< @deprecated @see APR_FPROT_UREAD      */
#define APR_UWRITE     APR_FPROT_UWRITE     /**< @deprecated @see APR_FPROT_UWRITE     */
#define APR_UEXECUTE   APR_FPROT_UEXECUTE   /**< @deprecated @see APR_FPROT_UEXECUTE   */
#define APR_GSETID     APR_FPROT_GSETID     /**< @deprecated @see APR_FPROT_GSETID     */
#define APR_GREAD      APR_FPROT_GREAD      /**< @deprecated @see APR_FPROT_GREAD      */
#define APR_GWRITE     APR_FPROT_GWRITE     /**< @deprecated @see APR_FPROT_GWRITE     */
#define APR_GEXECUTE   APR_FPROT_GEXECUTE   /**< @deprecated @see APR_FPROT_GEXECUTE   */
#define APR_WSTICKY    APR_FPROT_WSTICKY    /**< @deprecated @see APR_FPROT_WSTICKY    */
#define APR_WREAD      APR_FPROT_WREAD      /**< @deprecated @see APR_FPROT_WREAD      */
#define APR_WWRITE     APR_FPROT_WWRITE     /**< @deprecated @see APR_FPROT_WWRITE     */
#define APR_WEXECUTE   APR_FPROT_WEXECUTE   /**< @deprecated @see APR_FPROT_WEXECUTE   */
#define APR_OS_DEFAULT APR_FPROT_OS_DEFAULT /**< @deprecated @see APR_FPROT_OS_DEFAULT */
#define APR_FILE_SOURCE_PERMS APR_FPROT_FILE_SOURCE_PERMS /**< @deprecated @see APR_FPROT_FILE_SOURCE_PERMS */
    
/** @} */


/**
 * Structure for referencing directories.
 */
typedef struct apr_dir_t          apr_dir_t;
/**
 * Structure for determining file permissions.
 */
typedef apr_int32_t               apr_fileperms_t;
#if (defined WIN32) || (defined NETWARE)
/**
 * Structure for determining the device the file is on.
 */
typedef apr_uint32_t              apr_dev_t;
#else
/**
 * Structure for determining the device the file is on.
 */
typedef dev_t                     apr_dev_t;
#endif

/**
 * @defgroup apr_file_stat Stat Functions
 * @{
 */
/** file info structure */
typedef struct apr_finfo_t        apr_finfo_t;

#define APR_FINFO_LINK   0x00000001 /**< Stat the link not the file itself if it is a link */
#define APR_FINFO_MTIME  0x00000010 /**< Modification Time */
#define APR_FINFO_CTIME  0x00000020 /**< Creation or inode-changed time */
#define APR_FINFO_ATIME  0x00000040 /**< Access Time */
#define APR_FINFO_SIZE   0x00000100 /**< Size of the file */
#define APR_FINFO_CSIZE  0x00000200 /**< Storage size consumed by the file */
#define APR_FINFO_DEV    0x00001000 /**< Device */
#define APR_FINFO_INODE  0x00002000 /**< Inode */
#define APR_FINFO_NLINK  0x00004000 /**< Number of links */
#define APR_FINFO_TYPE   0x00008000 /**< Type */
#define APR_FINFO_USER   0x00010000 /**< User */
#define APR_FINFO_GROUP  0x00020000 /**< Group */
#define APR_FINFO_UPROT  0x00100000 /**< User protection bits */
#define APR_FINFO_GPROT  0x00200000 /**< Group protection bits */
#define APR_FINFO_WPROT  0x00400000 /**< World protection bits */
#define APR_FINFO_ICASE  0x01000000 /**< if dev is case insensitive */
#define APR_FINFO_NAME   0x02000000 /**< ->name in proper case */

#define APR_FINFO_MIN    0x00008170 /**< type, mtime, ctime, atime, size */
#define APR_FINFO_IDENT  0x00003000 /**< dev and inode */
#define APR_FINFO_OWNER  0x00030000 /**< user and group */
#define APR_FINFO_PROT   0x00700000 /**<  all protections */
#define APR_FINFO_NORM   0x0073b170 /**<  an atomic unix apr_stat() */
#define APR_FINFO_DIRENT 0x02000000 /**<  an atomic unix apr_dir_read() */

/**
 * The file information structure.  This is analogous to the POSIX
 * stat structure.
 */
struct apr_finfo_t {
    /** Allocates memory and closes lingering handles in the specified pool */
    apr_pool_t *pool;
    /** The bitmask describing valid fields of this apr_finfo_t structure 
     *  including all available 'wanted' fields and potentially more */
    apr_int32_t valid;
    /** The access permissions of the file.  Mimics Unix access rights. */
    apr_fileperms_t protection;
    /** The type of file.  One of APR_REG, APR_DIR, APR_CHR, APR_BLK, APR_PIPE, 
     * APR_LNK or APR_SOCK.  If the type is undetermined, the value is APR_NOFILE.
     * If the type cannot be determined, the value is APR_UNKFILE.
     */
    apr_filetype_e filetype;
    /** The user id that owns the file */
    apr_uid_t user;
    /** The group id that owns the file */
    apr_gid_t group;
    /** The inode of the file. */
    apr_ino_t inode;
    /** The id of the device the file is on. */
    apr_dev_t device;
    /** The number of hard links to the file. */
    apr_int32_t nlink;
    /** The size of the file */
    apr_off_t size;
    /** The storage size consumed by the file */
    apr_off_t csize;
    /** The time the file was last accessed */
    apr_time_t atime;
    /** The time the file was last modified */
    apr_time_t mtime;
    /** The time the file was created, or the inode was last changed */
    apr_time_t ctime;
    /** The pathname of the file (possibly unrooted) */
    const char *fname;
    /** The file's name (no path) in filesystem case */
    const char *name;
    /** Unused */
    struct apr_file_t *filehand;
};

/**
 * get the specified file's stats.  The file is specified by filename, 
 * instead of using a pre-opened file.
 * @param finfo Where to store the information about the file, which is
 * never touched if the call fails.
 * @param fname The name of the file to stat.
 * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_
                 values 
 * @param pool the pool to use to allocate the new file. 
 *
 * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may
 *       not be filled in, and you need to check the @c finfo->valid bitmask
 *       to verify that what you're looking for is there.
 */ 
APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo, const char *fname,
                                   apr_int32_t wanted, apr_pool_t *pool);

/** @} */
/**
 * @defgroup apr_dir Directory Manipulation Functions
 * @{
 */

/**
 * Open the specified directory.
 * @param new_dir The opened directory descriptor.
 * @param dirname The full path to the directory (use / on all systems)
 * @param pool The pool to use.
 */                        
APR_DECLARE(apr_status_t) apr_dir_open(apr_dir_t **new_dir, 
                                       const char *dirname, 
                                       apr_pool_t *pool);

/**
 * close the specified directory. 
 * @param thedir the directory descriptor to close.
 */                        
APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *thedir);

/**
 * Read the next entry from the specified directory. 
 * @param finfo the file info structure and filled in by apr_dir_read
 * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_
                 values 
 * @param thedir the directory descriptor returned from apr_dir_open
 * @remark No ordering is guaranteed for the entries read.
 *
 * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may
 *       not be filled in, and you need to check the @c finfo->valid bitmask
 *       to verify that what you're looking for is there. When no more
 *       entries are available, APR_ENOENT is returned.
 */                        
APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted,
                                       apr_dir_t *thedir);

/**
 * Rewind the directory to the first entry.
 * @param thedir the directory descriptor to rewind.
 */                        
APR_DECLARE(apr_status_t) apr_dir_rewind(apr_dir_t *thedir);
/** @} */

/**
 * @defgroup apr_filepath Filepath Manipulation Functions
 * @{
 */

/** Cause apr_filepath_merge to fail if addpath is above rootpath 
 * @bug in APR 0.9 and 1.x, this flag's behavior is undefined
 * if the rootpath is NULL or empty.  In APR 2.0 this should be
 * changed to imply NOTABSOLUTE if the rootpath is NULL or empty.
 */
#define APR_FILEPATH_NOTABOVEROOT   0x01

/** internal: Only meaningful with APR_FILEPATH_NOTABOVEROOT */
#define APR_FILEPATH_SECUREROOTTEST 0x02

/** Cause apr_filepath_merge to fail if addpath is above rootpath,
 * even given a rootpath /foo/bar and an addpath ../bar/bash
 */
#define APR_FILEPATH_SECUREROOT     0x03

/** Fail apr_filepath_merge if the merged path is relative */
#define APR_FILEPATH_NOTRELATIVE    0x04

/** Fail apr_filepath_merge if the merged path is absolute */
#define APR_FILEPATH_NOTABSOLUTE    0x08

/** Return the file system's native path format (e.g. path delimiters
 * of ':' on MacOS9, '\' on Win32, etc.) */
#define APR_FILEPATH_NATIVE         0x10

/** Resolve the true case of existing directories and file elements
 * of addpath, (resolving any aliases on Win32) and append a proper 
 * trailing slash if a directory
 */
#define APR_FILEPATH_TRUENAME       0x20

/**
 * Extract the rootpath from the given filepath
 * @param rootpath the root file path returned with APR_SUCCESS or APR_EINCOMPLETE
 * @param filepath the pathname to parse for its root component
 * @param flags the desired rules to apply, from
 * <PRE>
 *      APR_FILEPATH_NATIVE    Use native path separators (e.g. '\' on Win32)
 *      APR_FILEPATH_TRUENAME  Tests that the root exists, and makes it proper
 * </PRE>
 * @param p the pool to allocate the new path string from
 * @remark on return, filepath points to the first non-root character in the
 * given filepath.  In the simplest example, given a filepath of "/foo", 
 * returns the rootpath of "/" and filepath points at "foo".  This is far 
 * more complex on other platforms, which will canonicalize the root form
 * to a consistant format, given the APR_FILEPATH_TRUENAME flag, and also
 * test for the validity of that root (e.g., that a drive d:/ or network 
 * share //machine/foovol/). 
 * The function returns APR_ERELATIVE if filepath isn't rooted (an
 * error), APR_EINCOMPLETE if the root path is ambiguous (but potentially
 * legitimate, e.g. "/" on Windows is incomplete because it doesn't specify
 * the drive letter), or APR_EBADPATH if the root is simply invalid.
 * APR_SUCCESS is returned if filepath is an absolute path.
 */
APR_DECLARE(apr_status_t) apr_filepath_root(const char **rootpath, 
                                            const char **filepath, 
                                            apr_int32_t flags,
                                            apr_pool_t *p);

/**
 * Merge additional file path onto the previously processed rootpath
 * @param newpath the merged paths returned
 * @param rootpath the root file path (NULL uses the current working path)
 * @param addpath the path to add to the root path
 * @param flags the desired APR_FILEPATH_ rules to apply when merging
 * @param p the pool to allocate the new path string from
 * @remark if the flag APR_FILEPATH_TRUENAME is given, and the addpath 
 * contains wildcard characters ('*', '?') on platforms that don't support 
 * such characters within filenames, the paths will be merged, but the 
 * result code will be APR_EPATHWILD, and all further segments will not
 * reflect the true filenames including the wildcard and following segments.
 */                        
APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, 
                                             const char *rootpath,
                                             const char *addpath, 
                                             apr_int32_t flags,
                                             apr_pool_t *p);

/**
 * Split a search path into separate components
 * @param pathelts the returned components of the search path
 * @param liststr the search path (e.g., <tt>getenv("PATH")</tt>)
 * @param p the pool to allocate the array and path components from
 * @remark empty path components do not become part of @a pathelts.
 * @remark the path separator in @a liststr is system specific;
 * e.g., ':' on Unix, ';' on Windows, etc.
 */
APR_DECLARE(apr_status_t) apr_filepath_list_split(apr_array_header_t **pathelts,
                                                  const char *liststr,
                                                  apr_pool_t *p);

/**
 * Merge a list of search path components into a single search path
 * @param liststr the returned search path; may be NULL if @a pathelts is empty
 * @param pathelts the components of the search path
 * @param p the pool to allocate the search path from
 * @remark emtpy strings in the source array are ignored.
 * @remark the path separator in @a liststr is system specific;
 * e.g., ':' on Unix, ';' on Windows, etc.
 */
APR_DECLARE(apr_status_t) apr_filepath_list_merge(char **liststr,
                                                  apr_array_header_t *pathelts,
                                                  apr_pool_t *p);

/**
 * Return the default file path (for relative file names)
 * @param path the default path string returned
 * @param flags optional flag APR_FILEPATH_NATIVE to retrieve the
 *              default file path in os-native format.
 * @param p the pool to allocate the default path string from
 */
APR_DECLARE(apr_status_t) apr_filepath_get(char **path, apr_int32_t flags,
                                           apr_pool_t *p);

/**
 * Set the default file path (for relative file names)
 * @param path the default path returned
 * @param p the pool to allocate any working storage
 */
APR_DECLARE(apr_status_t) apr_filepath_set(const char *path, apr_pool_t *p);

/** The FilePath character encoding is unknown */
#define APR_FILEPATH_ENCODING_UNKNOWN  0

/** The FilePath character encoding is locale-dependent */
#define APR_FILEPATH_ENCODING_LOCALE   1

/** The FilePath character encoding is UTF-8 */
#define APR_FILEPATH_ENCODING_UTF8     2

/**
 * Determine the encoding used internally by the FilePath functions
 * @param style points to a variable which receives the encoding style flag
 * @param p the pool to allocate any working storage
 * @remark Use apr_os_locale_encoding() and/or apr_os_default_encoding()
 * to get the name of the path encoding if it's not UTF-8.
 */
APR_DECLARE(apr_status_t) apr_filepath_encoding(int *style, apr_pool_t *p);
/** @} */

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_FILE_INFO_H */
include/apr-1/apr_thread_pool.h000064400000025540150336140420012426 0ustar00/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed
 * with this work for additional information regarding copyright
 * ownership.  The ASF licenses this file to you under the Apache
 * License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License.  You may obtain a copy of
 * the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied.  See the License for the specific language governing
 * permissions and limitations under the License.
 */

#ifndef APU_THREAD_POOL_H
#define APU_THREAD_POOL_H

#include "apu.h"
#include "apr_thread_proc.h"

/**
 * @file apr_thread_pool.h
 * @brief APR Thread Pool Library

 * @remarks This library implements a thread pool using apr_thread_t. A thread
 * pool is a set of threads that can be created in advance or on demand until a
 * maximum number. When a task is scheduled, the thread pool will find an idle
 * thread to handle the task. In case all existing threads are busy and the
 * number of tasks in the queue is higher than the adjustable threshold, the
 * pool will try to create a new thread to serve the task if the maximum number
 * has not been reached. Otherwise, the task will be put into a queue based on
 * priority, which can be valued from 0 to 255, with higher values being served
 * first. If there are tasks with the same priority, the new task might be put at
 * the top or at the bottom - it depends on which function is used to put the task.
 *
 * @remarks There may be the case where the thread pool can use up to the maximum
 * number of threads at peak load, but having those threads idle afterwards. A
 * maximum number of idle threads can be set so that the extra idling threads will
 * be terminated to save system resources.
 */
#if APR_HAS_THREADS

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup APR_Util_TP Thread Pool routines
 * @ingroup APR_Util
 * @{
 */

/** Opaque Thread Pool structure. */
typedef struct apr_thread_pool apr_thread_pool_t;

#define APR_THREAD_TASK_PRIORITY_LOWEST 0
#define APR_THREAD_TASK_PRIORITY_LOW 63
#define APR_THREAD_TASK_PRIORITY_NORMAL 127
#define APR_THREAD_TASK_PRIORITY_HIGH 191
#define APR_THREAD_TASK_PRIORITY_HIGHEST 255

/**
 * Create a thread pool
 * @param me The pointer in which to return the newly created apr_thread_pool
 * object, or NULL if thread pool creation fails.
 * @param init_threads The number of threads to be created initially, this number
 * will also be used as the initial value for the maximum number of idle threads.
 * @param max_threads The maximum number of threads that can be created
 * @param pool The pool to use
 * @return APR_SUCCESS if the thread pool was created successfully. Otherwise,
 * the error code.
 */
APU_DECLARE(apr_status_t) apr_thread_pool_create(apr_thread_pool_t **me,
                                                 apr_size_t init_threads,
                                                 apr_size_t max_threads,
                                                 apr_pool_t *pool);

/**
 * Destroy the thread pool and stop all the threads
 * @return APR_SUCCESS if all threads are stopped.
 */
APU_DECLARE(apr_status_t) apr_thread_pool_destroy(apr_thread_pool_t *me);

/**
 * Schedule a task to the bottom of the tasks of same priority.
 * @param me The thread pool
 * @param func The task function
 * @param param The parameter for the task function
 * @param priority The priority of the task.
 * @param owner Owner of this task.
 * @return APR_SUCCESS if the task had been scheduled successfully
 */
APU_DECLARE(apr_status_t) apr_thread_pool_push(apr_thread_pool_t *me,
                                               apr_thread_start_t func,
                                               void *param,
                                               apr_byte_t priority,
                                               void *owner);
/**
 * Schedule a task to be run after a delay
 * @param me The thread pool
 * @param func The task function
 * @param param The parameter for the task function
 * @param time Time in microseconds
 * @param owner Owner of this task.
 * @return APR_SUCCESS if the task had been scheduled successfully
 */
APU_DECLARE(apr_status_t) apr_thread_pool_schedule(apr_thread_pool_t *me,
                                                   apr_thread_start_t func,
                                                   void *param,
                                                   apr_interval_time_t time,
                                                   void *owner);

/**
 * Schedule a task to the top of the tasks of same priority.
 * @param me The thread pool
 * @param func The task function
 * @param param The parameter for the task function
 * @param priority The priority of the task.
 * @param owner Owner of this task.
 * @return APR_SUCCESS if the task had been scheduled successfully
 */
APU_DECLARE(apr_status_t) apr_thread_pool_top(apr_thread_pool_t *me,
                                              apr_thread_start_t func,
                                              void *param,
                                              apr_byte_t priority,
                                              void *owner);

/**
 * Cancel tasks submitted by the owner. If there is any task from the owner that
 * is currently running, the function will spin until the task finished.
 * @param me The thread pool
 * @param owner Owner of the task
 * @return APR_SUCCESS if the task has been cancelled successfully
 * @note The task function should not be calling cancel, otherwise the function
 * may get stuck forever. The function assert if it detect such a case.
 */
APU_DECLARE(apr_status_t) apr_thread_pool_tasks_cancel(apr_thread_pool_t *me,
                                                       void *owner);

/**
 * Get the current number of tasks waiting in the queue
 * @param me The thread pool
 * @return Number of tasks in the queue
 */
APU_DECLARE(apr_size_t) apr_thread_pool_tasks_count(apr_thread_pool_t *me);

/**
 * Get the current number of scheduled tasks waiting in the queue
 * @param me The thread pool
 * @return Number of scheduled tasks in the queue
 */
APU_DECLARE(apr_size_t) apr_thread_pool_scheduled_tasks_count(apr_thread_pool_t *me);

/**
 * Get the current number of threads
 * @param me The thread pool
 * @return Total number of threads
 */
APU_DECLARE(apr_size_t) apr_thread_pool_threads_count(apr_thread_pool_t *me);

/**
 * Get the current number of busy threads
 * @param me The thread pool
 * @return Number of busy threads
 */
APU_DECLARE(apr_size_t) apr_thread_pool_busy_count(apr_thread_pool_t *me);

/**
 * Get the current number of idle threads
 * @param me The thread pool
 * @return Number of idle threads
 */
APU_DECLARE(apr_size_t) apr_thread_pool_idle_count(apr_thread_pool_t *me);

/**
 * Access function for the maximum number of idle threads. Number of current
 * idle threads will be reduced to the new limit.
 * @param me The thread pool
 * @param cnt The number
 * @return The number of threads that were stopped.
 */
APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_set(apr_thread_pool_t *me,
                                                     apr_size_t cnt);

/**
 * Get number of tasks that have run
 * @param me The thread pool
 * @return Number of tasks that have run
 */
APU_DECLARE(apr_size_t)
    apr_thread_pool_tasks_run_count(apr_thread_pool_t * me);

/**
 * Get high water mark of the number of tasks waiting to run
 * @param me The thread pool
 * @return High water mark of tasks waiting to run
 */
APU_DECLARE(apr_size_t)
    apr_thread_pool_tasks_high_count(apr_thread_pool_t * me);

/**
 * Get high water mark of the number of threads
 * @param me The thread pool
 * @return High water mark of threads in thread pool
 */
APU_DECLARE(apr_size_t)
    apr_thread_pool_threads_high_count(apr_thread_pool_t * me);

/**
 * Get the number of idle threads that were destroyed after timing out
 * @param me The thread pool
 * @return Number of idle threads that timed out
 */
APU_DECLARE(apr_size_t)
    apr_thread_pool_threads_idle_timeout_count(apr_thread_pool_t * me);

/**
 * Access function for the maximum number of idle threads
 * @param me The thread pool
 * @return The current maximum number
 */
APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_get(apr_thread_pool_t *me);

/**
 * Access function for the maximum number of threads.
 * @param me The thread pool
 * @param cnt Number of threads
 * @return The original maximum number of threads
 */
APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_set(apr_thread_pool_t *me,
                                                       apr_size_t cnt);

/**
 * Access function for the maximum wait time (in microseconds) of an
 * idling thread that exceeds the maximum number of idling threads.
 * A non-zero value allows for the reaping of idling threads to shrink
 * over time.  Which helps reduce thrashing.
 * @param me The thread pool
 * @param timeout The number of microseconds an idle thread should wait
 * till it reaps itself
 * @return The original maximum wait time
 */
APU_DECLARE(apr_interval_time_t)
    apr_thread_pool_idle_wait_set(apr_thread_pool_t * me,
                                  apr_interval_time_t timeout);

/**
 * Access function for the maximum wait time (in microseconds) of an
 * idling thread that exceeds the maximum number of idling threads
 * @param me The thread pool
 * @return The current maximum wait time
 */
APU_DECLARE(apr_interval_time_t)
    apr_thread_pool_idle_wait_get(apr_thread_pool_t * me);

/**
 * Access function for the maximum number of threads
 * @param me The thread pool
 * @return The current maximum number
 */
APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_get(apr_thread_pool_t *me);

/**
 * Access function for the threshold of tasks in queue to trigger a new thread.
 * @param me The thread pool
 * @param cnt The new threshold
 * @return The original threshold
 */
APU_DECLARE(apr_size_t) apr_thread_pool_threshold_set(apr_thread_pool_t *me,
                                                      apr_size_t val);

/**
 * Access function for the threshold of tasks in queue to trigger a new thread.
 * @param me The thread pool
 * @return The current threshold
 */
APU_DECLARE(apr_size_t) apr_thread_pool_threshold_get(apr_thread_pool_t * me);

/**
 * Get owner of the task currently been executed by the thread.
 * @param thd The thread is executing a task
 * @param owner Pointer to receive owner of the task.
 * @return APR_SUCCESS if the owner is retrieved successfully
 */
APU_DECLARE(apr_status_t) apr_thread_pool_task_owner_get(apr_thread_t *thd,
                                                         void **owner);

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* APR_HAS_THREADS */
#endif /* !APR_THREAD_POOL_H */
include/apr-1/apr_ldap.h000064400000013110150336140420011034 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
 */
/**
 * @file apr_ldap.h
 * @brief  APR-UTIL LDAP 
 */
#ifndef APU_LDAP_H
#define APU_LDAP_H

/**
 * @defgroup APR_Util_LDAP LDAP
 * @ingroup APR_Util
 * @{
 */

/* this will be defined if LDAP support was compiled into apr-util */
#define APR_HAS_LDAP		  1

/* identify the LDAP toolkit used */
#define APR_HAS_NETSCAPE_LDAPSDK  0
#define APR_HAS_SOLARIS_LDAPSDK   0
#define APR_HAS_NOVELL_LDAPSDK    0
#define APR_HAS_MOZILLA_LDAPSDK   0
#define APR_HAS_OPENLDAP_LDAPSDK  1
#define APR_HAS_MICROSOFT_LDAPSDK 0
#define APR_HAS_TIVOLI_LDAPSDK    0
#define APR_HAS_ZOS_LDAPSDK       0
#define APR_HAS_OTHER_LDAPSDK     0


/*
 * Handle the case when LDAP is enabled
 */
#if APR_HAS_LDAP

/*
 * The following #defines are DEPRECATED and should not be used for
 * anything. They remain to maintain binary compatibility.
 * The original code defined the OPENLDAP SDK as present regardless
 * of what really was there, which was way bogus. In addition, the
 * apr_ldap_url_parse*() functions have been rewritten specifically for
 * APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
 */
#if APR_HAS_TIVOLI_LDAPSDK
#define APR_HAS_LDAP_SSL 0
#else
#define APR_HAS_LDAP_SSL 1
#endif
#define APR_HAS_LDAP_URL_PARSE      0

#if APR_HAS_OPENLDAP_LDAPSDK && !defined(LDAP_DEPRECATED) 
/* Ensure that the "deprecated" interfaces are still exposed
 * with OpenLDAP >= 2.3; these were exposed by default in earlier
 * releases. */
#define LDAP_DEPRECATED 1
#endif

/*
 * Include the standard LDAP header files.
 */

#include <lber.h>
#include <ldap.h>



/*
 * Detected standard functions
 */
#define APR_HAS_LDAPSSL_CLIENT_INIT 0
#define APR_HAS_LDAPSSL_CLIENT_DEINIT 0
#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT 0
#define APR_HAS_LDAP_START_TLS_S 1
#define APR_HAS_LDAP_SSLINIT 0
#define APR_HAS_LDAPSSL_INIT 0
#define APR_HAS_LDAPSSL_INSTALL_ROUTINES 0

/*
 * Make sure the secure LDAP port is defined
 */
#ifndef LDAPS_PORT
#define LDAPS_PORT 636  /* ldaps:/// default LDAP over TLS port */
#endif

/*
 * For ldap function calls that input a size limit on the number of returned elements
 * Some SDKs do not have the define for LDAP_DEFAULT_LIMIT (-1) or LDAP_NO_LIMIT (0)
 * LDAP_DEFAULT_LIMIT is preferred as it allows inheritance from whatever the SDK
 * or process is configured for.
 */
#ifdef LDAP_DEFAULT_LIMIT
#define APR_LDAP_SIZELIMIT LDAP_DEFAULT_LIMIT
#else
#ifdef LDAP_NO_LIMIT
#define APR_LDAP_SIZELIMIT LDAP_NO_LIMIT
#endif
#endif

#ifndef APR_LDAP_SIZELIMIT
#define APR_LDAP_SIZELIMIT 0 /* equivalent to LDAP_NO_LIMIT, and what goes on the wire */
#endif

/*
 * z/OS is missing some defines
 */
#ifndef LDAP_VERSION_MAX
#define LDAP_VERSION_MAX  LDAP_VERSION
#endif
#if APR_HAS_ZOS_LDAPSDK
#define LDAP_VENDOR_NAME "IBM z/OS"
#endif

/* Note: Macros defining const casting has been removed in APR v1.0,
 * pending real support for LDAP v2.0 toolkits.
 *
 * In the mean time, please use an LDAP v3.0 toolkit.
 */
#if LDAP_VERSION_MAX <= 2
#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
#endif 

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * This structure allows the C LDAP API error codes to be returned
 * along with plain text error messages that explain to us mere mortals
 * what really happened.
 */
typedef struct apr_ldap_err_t {
    const char *reason;
    const char *msg;
    int rc;
} apr_ldap_err_t;

#ifdef __cplusplus
}
#endif

/* The MS SDK returns LDAP_UNAVAILABLE when the backend has closed the connection
 * between LDAP calls. Protect with APR_HAS_MICROSOFT_LDAPSDK in case someone 
 * manually chooses another SDK on Windows 
 */
#if APR_HAS_MICROSOFT_LDAPSDK
#define APR_LDAP_IS_SERVER_DOWN(s)    ((s) == LDAP_SERVER_DOWN \
                                    || (s) == LDAP_UNAVAILABLE)
#else
#define APR_LDAP_IS_SERVER_DOWN(s)    ((s) == LDAP_SERVER_DOWN)
#endif

/* These symbols are not actually exported in a DSO build, but mapped into
 * a private exported function array for apr_ldap_stub to bind dynamically.
 * Rename them appropriately to protect the global namespace.
 */
#ifdef APU_DSO_LDAP_BUILD

#define apr_ldap_info apr__ldap_info
#define apr_ldap_init apr__ldap_init
#define apr_ldap_ssl_init apr__ldap_ssl_init
#define apr_ldap_ssl_deinit apr__ldap_ssl_deinit
#define apr_ldap_get_option apr__ldap_get_option
#define apr_ldap_set_option apr__ldap_set_option
#define apr_ldap_rebind_init apr__ldap_rebind_init
#define apr_ldap_rebind_add apr__ldap_rebind_add
#define apr_ldap_rebind_remove apr__ldap_rebind_remove

#define APU_DECLARE_LDAP(type) type
#else
#define APU_DECLARE_LDAP(type) APU_DECLARE(type)
#endif

#include "apr_ldap_url.h"
#include "apr_ldap_init.h"
#include "apr_ldap_option.h"
#include "apr_ldap_rebind.h"

#endif /* APR_HAS_LDAP */
/** @} */
#endif /* APU_LDAP_H */
include/apr-1/apr_encode.h000064400000074545150336140420011374 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file apr_encode.h
 * @brief APR-UTIL Encoding
 */
#ifndef APR_ENCODE_H
#define APR_ENCODE_H

#include "apr.h"
#include "apr_general.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup APR_Util_Encode Base64/Base64Url/Base32/Base32Hex/Base16 Encoding
 * @ingroup APR_Util
 * @{
 */

/**
 * RFC4648 and RFC7515 compliant BASE64, BASE64URL, BASE32, BASE32HEX
 * and BASE16 encode/decode functions.
 *
 * The following encodings are supported:
 *
 * - Base 64 Encoding
 *
 *   o Use flag APR_ENCODE_NONE
 *   o https://tools.ietf.org/html/rfc4648#section-4
 *
 * - Base 64 Encoding with URL and Filename Safe Alphabet
 *
 *   o Use flag APR_ENCODE_URL
 *   o https://tools.ietf.org/html/rfc4648#section-5
 *
 * - Base 64 URL Encoding without Padding
 *
 *   o Use flag APR_ENCODE_BASE64URL
 *   o https://tools.ietf.org/html/rfc7515#appendix-C
 *
 * - Base 32 Encoding
 *
 *   o Use flag APR_ENCODE_NONE
 *   o https://tools.ietf.org/html/rfc4648#section-6
 *
 * - Base 32 Encoding with Extended Hex Alphabet
 *
 *   o Use flag APR_ENCODE_BASE32HEX
 *   o https://tools.ietf.org/html/rfc4648#section-7
 *
 * - Base 16 Encoding
 *
 *   o Use flags APR_ENCODE_NONE/APR_ENCODE_COLON
 *   o https://tools.ietf.org/html/rfc4648#section-8
 *
 * If a non valid character of any kind including whitespace is passed to any
 * of the decoder functions, APR_BADCH will be returned. In this case decoding
 * will still take place, but the results can not be trusted.
 *
 * If APR_ENCODE_RELAXED is passed to the decoder functions, decoding will be
 * attempted up until the first non valid character. If this results in an
 * invalid state in the decoder, such as but not limited to an odd number of
 * base16 characters, APR_BADCH will still be returned.
 *
 * If APR_ENCODE_RELAXED is not passed to a decoder function, the decoding will
 * be done in constant time regardless of whether the result returns APR_SUCCESS
 * or APR_BADCH.
 *
 * If the dest parameter is NULL, the maximum theoretical buffer size is
 * returned in the len field, including space for a terminating zero character
 * if the destination is a string. This value can be used to allocate buffers
 * of a suitable safe size.
 *
 * If the dest parameter is provided, the encoding or decoding will take place,
 * and the actual number of characters written is returned in the len field,
 * ignoring any terminating zero.
 *
 * Plain strings are not assumed '\0' terminated unless APR_ENCODE_STRING is
 * provided.
 *
 */

/**
 * When passing a string to one of the encode functions, this value can be
 * passed to indicate a string-valued key, and have the length computed
 * automatically.
 */
#define APR_ENCODE_STRING      (-1)

/**
 * Generate RFC4648 base16/base32/base64.
 */
#define APR_ENCODE_NONE 0

/**
 * If relaxed, decode up until the first non base16/base32/base64 character.
 */
#define APR_ENCODE_RELAXED 1

/**
 * Omit the padding character (=) while encoding.
 */
#define APR_ENCODE_NOPADDING 2

/**
 * Generate RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet
 */
#define APR_ENCODE_URL 4

/**
 * Generate RFC7515 BASE64URL
 */
#define APR_ENCODE_BASE64URL (APR_ENCODE_NOPADDING | APR_ENCODE_URL)

/**
 * Generate base32hex encoding instead of base32 encoding
 */
#define APR_ENCODE_BASE32HEX 8

/**
 * Generate base16 with colons between each token.
 */
#define APR_ENCODE_COLON 16

/**
 * Generate base16 with lower case characters.
 */
#define APR_ENCODE_LOWER 32

/**
 * Convert text data to base64.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for encoding.
 * @param src The original string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
 *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
 *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
 * @param len If not NULL, outputs the length of the buffer needed for encoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to encode.
 */
APR_DECLARE(apr_status_t) apr_encode_base64(char *dest, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert binary data to base64.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for encoding.
 * @param src The original buffer, can be NULL if \c dest is NULL.
 * @param slen The length of the original buffer.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
 *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
 *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
 * @param len If not NULL, outputs the length of the buffer needed for encoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is negative, or APR_NOTFOUND
 *  if \c dest is not NULL and \c src is NULL, or APR_ENOSPC if \c dest is NULL
 *  and the source length (based on \c slen or APR_ENCODE_STRING) is too big to
 *  encode.
 */
APR_DECLARE(apr_status_t) apr_encode_base64_binary(char *dest, const unsigned char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert text data to base64, and return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The original string.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
 *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
 *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the encoding is not
 *  possible (see apr_encode_base64 errors).
 */
APR_DECLARE(const char *)apr_pencode_base64(apr_pool_t * p, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)__attribute__((nonnull(1)));

/**
 * Convert binary data to base64, and return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The original buffer.
 * @param slen The length of the original buffer.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
 *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
 *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the encoding is not
 *  possible (see apr_encode_base64_binary errors).
 */
APR_DECLARE(const char *)apr_pencode_base64_binary(apr_pool_t * p, const unsigned char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)__attribute__((nonnull(1)));

/**
 * Convert base64 or base64url with or without padding to text data.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for decoding.
 * @param src The base64 string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the base64 string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, attempt to decode the full base64 string,
 *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
 *  decode until the first non base64/base64url character.
 * @param len If not NULL, outputs the length of the buffer needed for decoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
 *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base64
 *  encoding, or APR_BADCH if a non base64 character is present and
 *  APR_ENCODE_RELAXED is not specified.
 */
APR_DECLARE(apr_status_t) apr_decode_base64(char *dest, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert base64 or base64url with or without padding to binary data.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for decoding.
 * @param src The base64 string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the base64 string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, attempt to decode the full base64 string,
 *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
 *  decode until the first non base64/base64url character.
 * @param len If not NULL, outputs the length of the buffer needed for decoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
 *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base64
 *  encoding, or APR_BADCH if a non base64 character is present and
 *  APR_ENCODE_RELAXED is not specified.
 */
APR_DECLARE(apr_status_t) apr_decode_base64_binary(unsigned char *dest,
        const char *src, apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert base64 or base64url with or without padding to text data, and
 * return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The base64 string to decode.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, attempt to decode the full original buffer,
 *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
 *  decode until the first non base64/base64url character.
 * @param len If not NULL, outputs the length of the decoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the decoding is not
 *  possible (see apr_decode_base64_binary errors).
 */
APR_DECLARE(const char *)apr_pdecode_base64(apr_pool_t * p, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert base64 or base64url with or without padding to binary data, and
 * return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The base64 string to decode.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, attempt to decode the full original buffer,
 *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
 *  decode until the first non base64/base64url character.
 * @param len If not NULL, outputs the length of the decoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the decoding is not
 *  possible (see apr_decode_base64_binary errors).
 */
APR_DECLARE(const unsigned char *)apr_pdecode_base64_binary(apr_pool_t * p,
        const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert text data to base32.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for encoding.
 * @param src The original string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
 *  use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the buffer needed for encoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to encode.
 */
APR_DECLARE(apr_status_t) apr_encode_base32(char *dest, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert binary data to base32.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for encoding.
 * @param src The original buffer, can be NULL if \c dest is NULL.
 * @param slen The length of the original buffer.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
 *  use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the buffer needed for encoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is negative, or APR_NOTFOUND
 *  if \c dest is not NULL and \c src is NULL, or APR_ENOSPC if \c dest is NULL
 *  and the source length (based on \c slen or APR_ENCODE_STRING) is too big to
 *  encode.
 */
APR_DECLARE(apr_status_t) apr_encode_base32_binary(char *dest, const unsigned char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert text data to base32, and return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The original string.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
 *  use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the encoding is not
 *  possible (see apr_encode_base32 errors).
 */
APR_DECLARE(const char *)apr_pencode_base32(apr_pool_t * p, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert binary data to base32, and return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The original buffer.
 * @param slen The length of the original buffer.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
 *  use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the encoding is not
 *  possible (see apr_encode_base32_binary errors).
 */
APR_DECLARE(const char *)apr_pencode_base32_binary(apr_pool_t * p, const unsigned char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert base32 or base32hex with or without padding to text data.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for decoding.
 * @param src The base32 string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the base32 string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the buffer needed for decoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
 *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base32
 *  encoding, or APR_BADCH if a non base32 character is present and
 *  APR_ENCODE_RELAXED is not specified.
 */
APR_DECLARE(apr_status_t) apr_decode_base32(char *dest, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert base32 or base32hex with or without padding to binary data.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for decoding.
 * @param src The base32 string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the base32 string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the buffer needed for decoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
 *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base32
 *  encoding, or APR_BADCH if a non base32 character is present and
 *  APR_ENCODE_RELAXED is not specified.
 */
APR_DECLARE(apr_status_t) apr_decode_base32_binary(unsigned char *dest,
        const char *src, apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert base32 or base32hex with or without padding to text data, and
 * return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The base32 string to decode.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the decoding is not
 *  possible (see apr_decode_base32 errors).
 */
APR_DECLARE(const char *)apr_pdecode_base32(apr_pool_t * p, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert base32 or base32hex with or without padding to binary data, and
 * return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The base32 string to decode.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
 *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the decoding is not
 *  possible (see apr_decode_base32_binary errors).
 */
APR_DECLARE(const unsigned char *)apr_pdecode_base32_binary(apr_pool_t * p,
        const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert text data to base16 (hex).
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for encoding.
 * @param src The original string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, separate each token with a colon.
 * @param len If not NULL, outputs the length of the buffer needed for encoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to encode.
 */
APR_DECLARE(apr_status_t) apr_encode_base16(char *dest, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert binary data to base16 (hex).
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for encoding.
 * @param src The original buffer, can be NULL if \c dest is NULL.
 * @param slen The length of the original buffer.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, separate each token with a colon.
 * @param len If not NULL, outputs the length of the buffer needed for encoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is negative, or APR_NOTFOUND
 *  if \c dest is not NULL and \c src is NULL, or APR_ENOSPC if \c dest is NULL
 *  and the source length (based on \c slen or APR_ENCODE_STRING) is too big to
 *  encode.
 */
APR_DECLARE(apr_status_t) apr_encode_base16_binary(char *dest,
        const unsigned char *src, apr_ssize_t slen, int flags,
        apr_size_t * len);

/**
 * Convert text data to base16 (hex), and return the results from a
 * pool.
 * @param p Pool to allocate from.
 * @param src The original string.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, separate each token with a colon.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the encoding is not
 *  possible (see apr_encode_base16 errors).
 */
APR_DECLARE(const char *)apr_pencode_base16(apr_pool_t * p, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert binary data to base16 (hex), and return the results from a
 * pool.
 * @param p Pool to allocate from.
 * @param src The original buffer.
 * @param slen The length of the original buffer.
 * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, separate each token with a colon.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the encoding is not
 *  possible (see apr_encode_base16_binary errors).
 */
APR_DECLARE(const char *)apr_pencode_base16_binary(apr_pool_t * p,
        const unsigned char *src, apr_ssize_t slen,
        int flags, apr_size_t * len)__attribute__((nonnull(1)));

/**
 * Convert base16 (hex) to text data.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for decoding.
 * @param src The base16 string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the base16 string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
 * @param len If not NULL, outputs the length of the buffer needed for decoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
 *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base16
 *  encoding, or APR_BADCH if a non base16 character is present and
 *  APR_ENCODE_RELAXED is not specified.
 */
APR_DECLARE(apr_status_t) apr_decode_base16(char *dest, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert base16 (hex) to binary data.
 * @param dest The destination string, can be NULL to output in \c len the
 *  needed buffer length for decoding.
 * @param src The base16 string, can be NULL if \c dest is NULL and \c slen
 *  is positive or nul.
 * @param slen The length of the base16 string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
 * @param len If not NULL, outputs the length of the buffer needed for decoding
 *  (including the trailing NUL) if \c dest is NULL, or the actual length of
 *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
 * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
 *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
 *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
 *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
 *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base16
 *  encoding, or APR_BADCH if a non base16 character is present and
 *  APR_ENCODE_RELAXED is not specified.
 */
APR_DECLARE(apr_status_t) apr_decode_base16_binary(unsigned char *dest,
        const char *src, apr_ssize_t slen, int flags, apr_size_t * len);

/**
 * Convert base16 (hex) and return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The base16 string to decode.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the decoding is not
 *  possible (see apr_decode_base16 errors).
 */
APR_DECLARE(const char *)apr_pdecode_base16(apr_pool_t * p, const char *src,
        apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/**
 * Convert base16 (hex) to binary data, and return the results from a pool.
 * @param p Pool to allocate from.
 * @param src The base16 string to decode.
 * @param slen The length of the original string, or APR_ENCODE_STRING if
 *  the actual length should be computed based on NUL termination.
 * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
 *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
 * @param len If not NULL, outputs the length of the encoding (excluding the
 *  trailing NUL).
 * @return A NUL terminated string allocated from the pool on success,
 *  or NULL if src is NULL or allocation failed or the decoding is not
 *  possible (see apr_decode_base16_binary errors).
 */
APR_DECLARE(const unsigned char *)apr_pdecode_base16_binary(apr_pool_t * p,
        const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
        __attribute__((nonnull(1)));

/** @} */
#ifdef __cplusplus
}
#endif

#endif                          /* !APR_ENCODE_H */
include/apr-1/apr_rmm.h000064400000011252150336140420010714 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_RMM_H
#define APR_RMM_H
/** 
 * @file apr_rmm.h
 * @brief APR-UTIL Relocatable Memory Management Routines
 */
/**
 * @defgroup APR_Util_RMM Relocatable Memory Management Routines
 * @ingroup APR_Util
 * @{
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apu.h"
#include "apr_anylock.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/** Structure to access Relocatable, Managed Memory */
typedef struct apr_rmm_t apr_rmm_t;

/** Fundamental allocation unit, within a specific apr_rmm_t */
typedef apr_size_t   apr_rmm_off_t;

/**
 * Initialize a relocatable memory block to be managed by the apr_rmm API.
 * @param rmm The relocatable memory block
 * @param lock An apr_anylock_t of the appropriate type of lock, or NULL
 *             if no locking is required.
 * @param membuf The block of relocatable memory to be managed
 * @param memsize The size of relocatable memory block to be managed
 * @param cont The pool to use for local storage and management
 * @remark Both @param membuf and @param memsize must be aligned
 * (for instance using APR_ALIGN_DEFAULT).
 */
APU_DECLARE(apr_status_t) apr_rmm_init(apr_rmm_t **rmm, apr_anylock_t *lock,
                                       void *membuf, apr_size_t memsize, 
                                       apr_pool_t *cont);

/**
 * Destroy a managed memory block.
 * @param rmm The relocatable memory block to destroy
 */
APU_DECLARE(apr_status_t) apr_rmm_destroy(apr_rmm_t *rmm);

/**
 * Attach to a relocatable memory block already managed by the apr_rmm API.
 * @param rmm The relocatable memory block
 * @param lock An apr_anylock_t of the appropriate type of lock
 * @param membuf The block of relocatable memory already under management
 * @param cont The pool to use for local storage and management
 */
APU_DECLARE(apr_status_t) apr_rmm_attach(apr_rmm_t **rmm, apr_anylock_t *lock,
                                         void *membuf, apr_pool_t *cont);

/**
 * Detach from the managed block of memory.
 * @param rmm The relocatable memory block to detach from
 */
APU_DECLARE(apr_status_t) apr_rmm_detach(apr_rmm_t *rmm);

/**
 * Allocate memory from the block of relocatable memory.
 * @param rmm The relocatable memory block
 * @param reqsize How much memory to allocate
 */
APU_DECLARE(apr_rmm_off_t) apr_rmm_malloc(apr_rmm_t *rmm, apr_size_t reqsize);

/**
 * Realloc memory from the block of relocatable memory.
 * @param rmm The relocatable memory block
 * @param entity The memory allocation to realloc
 * @param reqsize The new size
 */
APU_DECLARE(apr_rmm_off_t) apr_rmm_realloc(apr_rmm_t *rmm, void *entity, apr_size_t reqsize);

/**
 * Allocate memory from the block of relocatable memory and initialize it to zero.
 * @param rmm The relocatable memory block
 * @param reqsize How much memory to allocate
 */
APU_DECLARE(apr_rmm_off_t) apr_rmm_calloc(apr_rmm_t *rmm, apr_size_t reqsize);

/**
 * Free allocation returned by apr_rmm_malloc or apr_rmm_calloc.
 * @param rmm The relocatable memory block
 * @param entity The memory allocation to free
 */
APU_DECLARE(apr_status_t) apr_rmm_free(apr_rmm_t *rmm, apr_rmm_off_t entity);

/**
 * Retrieve the physical address of a relocatable allocation of memory
 * @param rmm The relocatable memory block
 * @param entity The memory allocation to free
 * @return address The address, aligned with APR_ALIGN_DEFAULT.
 */
APU_DECLARE(void *) apr_rmm_addr_get(apr_rmm_t *rmm, apr_rmm_off_t entity);

/**
 * Compute the offset of a relocatable allocation of memory
 * @param rmm The relocatable memory block
 * @param entity The physical address to convert to an offset
 */
APU_DECLARE(apr_rmm_off_t) apr_rmm_offset_get(apr_rmm_t *rmm, void *entity);

/**
 * Compute the required overallocation of memory needed to fit n allocs
 * @param n The number of alloc/calloc regions desired
 */
APU_DECLARE(apr_size_t) apr_rmm_overhead_get(int n);

#ifdef __cplusplus
}
#endif
/** @} */
#endif  /* ! APR_RMM_H */

include/apr-1/apr_date.h000064400000006742150336140420011046 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_DATE_H
#define APR_DATE_H

/**
 * @file apr_date.h
 * @brief APR-UTIL date routines
 */

/**
 * @defgroup APR_Util_Date Date routines
 * @ingroup APR_Util
 * @{
 */

/*
 * apr_date.h: prototypes for date parsing utility routines
 */

#include "apu.h"
#include "apr_time.h"

#ifdef __cplusplus
extern "C" {
#endif

/** A bad date. */
#define APR_DATE_BAD ((apr_time_t)0)

/**
 * Compare a string to a mask
 * @param data The string to compare
 * @param mask Mask characters (arbitrary maximum is 256 characters):
 * <PRE>
 *   '\@' - uppercase letter
 *   '\$' - lowercase letter
 *   '\&' - hex digit
 *   '#' - digit
 *   '~' - digit or space
 *   '*' - swallow remaining characters
 * </PRE>
 * @remark The mask tests for an exact match for any other character
 * @return 1 if the string matches, 0 otherwise
 */
APU_DECLARE(int) apr_date_checkmask(const char *data, const char *mask);

/**
 * Parses an HTTP date in one of three standard forms:
 * <PRE>
 *     Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
 *     Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
 *     Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format
 * </PRE>
 * @param date The date in one of the three formats above
 * @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
 *         0 if this would be out of range or if the date is invalid.
 */
APU_DECLARE(apr_time_t) apr_date_parse_http(const char *date);

/**
 * Parses a string resembling an RFC 822 date.  This is meant to be
 * leinent in its parsing of dates.  Hence, this will parse a wider 
 * range of dates than apr_date_parse_http.
 *
 * The prominent mailer (or poster, if mailer is unknown) that has
 * been seen in the wild is included for the unknown formats.
 * <PRE>
 *     Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
 *     Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
 *     Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format
 *     Sun, 6 Nov 1994 08:49:37 GMT   ; RFC 822, updated by RFC 1123
 *     Sun, 06 Nov 94 08:49:37 GMT    ; RFC 822
 *     Sun, 6 Nov 94 08:49:37 GMT     ; RFC 822
 *     Sun, 06 Nov 94 08:49 GMT       ; Unknown [drtr\@ast.cam.ac.uk] 
 *     Sun, 6 Nov 94 08:49 GMT        ; Unknown [drtr\@ast.cam.ac.uk]
 *     Sun, 06 Nov 94 8:49:37 GMT     ; Unknown [Elm 70.85]
 *     Sun, 6 Nov 94 8:49:37 GMT      ; Unknown [Elm 70.85] 
 * </PRE>
 *
 * @param date The date in one of the formats above
 * @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
 *         0 if this would be out of range or if the date is invalid.
 */
APU_DECLARE(apr_time_t) apr_date_parse_rfc(const char *date);

/** @} */
#ifdef __cplusplus
}
#endif

#endif	/* !APR_DATE_H */
include/apr-1/apr_dbd.h000064400000056545150336140420010670 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* Overview of what this is and does:
 * http://www.apache.org/~niq/dbd.html
 */

#ifndef APR_DBD_H
#define APR_DBD_H

#include "apu.h"
#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @file apr_dbd.h
 * @brief APR-UTIL DBD library
 */
/**
 * @defgroup APR_Util_DBD DBD routines
 * @ingroup APR_Util
 * @{
 */

/**
 * Mapping of C to SQL types, used for prepared statements.
 * @remarks
 * For apr_dbd_p[v]query/select functions, in and out parameters are always
 * const char * (i.e. regular nul terminated strings). LOB types are passed
 * with four (4) arguments: payload, length, table and column, all as const
 * char *, where table and column are reserved for future use by Oracle.
 * @remarks
 * For apr_dbd_p[v]bquery/select functions, in and out parameters are
 * described next to each enumeration constant and are generally native binary
 * types or some APR data type. LOB types are passed with four (4) arguments:
 * payload (char*), length (apr_size_t*), table (char*) and column (char*).
 * Table and column are reserved for future use by Oracle.
 */
typedef enum {
    APR_DBD_TYPE_NONE,
    APR_DBD_TYPE_TINY,       /**< \%hhd : in, out: char* */
    APR_DBD_TYPE_UTINY,      /**< \%hhu : in, out: unsigned char* */
    APR_DBD_TYPE_SHORT,      /**< \%hd  : in, out: short* */
    APR_DBD_TYPE_USHORT,     /**< \%hu  : in, out: unsigned short* */
    APR_DBD_TYPE_INT,        /**< \%d   : in, out: int* */
    APR_DBD_TYPE_UINT,       /**< \%u   : in, out: unsigned int* */
    APR_DBD_TYPE_LONG,       /**< \%ld  : in, out: long* */
    APR_DBD_TYPE_ULONG,      /**< \%lu  : in, out: unsigned long* */
    APR_DBD_TYPE_LONGLONG,   /**< \%lld : in, out: apr_int64_t* */
    APR_DBD_TYPE_ULONGLONG,  /**< \%llu : in, out: apr_uint64_t* */
    APR_DBD_TYPE_FLOAT,      /**< \%f   : in, out: float* */
    APR_DBD_TYPE_DOUBLE,     /**< \%lf  : in, out: double* */
    APR_DBD_TYPE_STRING,     /**< \%s   : in: char*, out: char** */
    APR_DBD_TYPE_TEXT,       /**< \%pDt : in: char*, out: char** */
    APR_DBD_TYPE_TIME,       /**< \%pDi : in: char*, out: char** */
    APR_DBD_TYPE_DATE,       /**< \%pDd : in: char*, out: char** */
    APR_DBD_TYPE_DATETIME,   /**< \%pDa : in: char*, out: char** */
    APR_DBD_TYPE_TIMESTAMP,  /**< \%pDs : in: char*, out: char** */
    APR_DBD_TYPE_ZTIMESTAMP, /**< \%pDz : in: char*, out: char** */
    APR_DBD_TYPE_BLOB,       /**< \%pDb : in: char* apr_size_t* char* char*, out: apr_bucket_brigade* */
    APR_DBD_TYPE_CLOB,       /**< \%pDc : in: char* apr_size_t* char* char*, out: apr_bucket_brigade* */
    APR_DBD_TYPE_NULL        /**< \%pDn : in: void*, out: void** */
} apr_dbd_type_e;

/* These are opaque structs.  Instantiation is up to each backend */
typedef struct apr_dbd_driver_t apr_dbd_driver_t;
typedef struct apr_dbd_t apr_dbd_t;
typedef struct apr_dbd_transaction_t apr_dbd_transaction_t;
typedef struct apr_dbd_results_t apr_dbd_results_t;
typedef struct apr_dbd_row_t apr_dbd_row_t;
typedef struct apr_dbd_prepared_t apr_dbd_prepared_t;

/** apr_dbd_init: perform once-only initialisation.  Call once only.
 *
 *  @param pool - pool to register any shutdown cleanups, etc
 */
APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool);

/** apr_dbd_get_driver: get the driver struct for a name
 *
 *  @param pool - (process) pool to register cleanup
 *  @param name - driver name
 *  @param driver - pointer to driver struct.
 *  @return APR_SUCCESS for success
 *  @return APR_ENOTIMPL for no driver (when DSO not enabled)
 *  @return APR_EDSOOPEN if DSO driver file can't be opened
 *  @return APR_ESYMNOTFOUND if the driver file doesn't contain a driver
 */
APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
                                             const apr_dbd_driver_t **driver);

/** apr_dbd_open_ex: open a connection to a backend
 *
 *  @param driver - driver struct.
 *  @param pool - working pool
 *  @param params - arguments to driver (implementation-dependent)
 *  @param handle - pointer to handle to return
 *  @param error - descriptive error.
 *  @return APR_SUCCESS for success
 *  @return APR_EGENERAL if driver exists but connection failed
 *  @remarks PostgreSQL: the params is passed directly to the PQconnectdb()
 *  function (check PostgreSQL documentation for more details on the syntax).
 *  @remarks SQLite2: the params is split on a colon, with the first part used
 *  as the filename and second part converted to an integer and used as file
 *  mode.
 *  @remarks SQLite3: the params is passed directly to the sqlite3_open()
 *  function as a filename to be opened (check SQLite3 documentation for more
 *  details).
 *  @remarks Oracle: the params can have "user", "pass", "dbname" and "server"
 *  keys, each followed by an equal sign and a value. Such key/value pairs can
 *  be delimited by space, CR, LF, tab, semicolon, vertical bar or comma.
 *  @remarks MySQL: the params can have "host", "port", "user", "pass",
 *  "dbname", "sock", "flags" "fldsz", "group" and "reconnect" keys, each
 *  followed by an equal sign and a value. Such key/value pairs can be
 *  delimited by space, CR, LF, tab, semicolon, vertical bar or comma. For
 *  now, "flags" can only recognise CLIENT_FOUND_ROWS (check MySQL manual for
 *  details). The value associated with "fldsz" determines maximum amount of
 *  memory (in bytes) for each of the fields in the result set of prepared
 *  statements. By default, this value is 1 MB. The value associated with
 *  "group" determines which group from configuration file to use (see
 *  MYSQL_READ_DEFAULT_GROUP option of mysql_options() in MySQL manual).
 *  Reconnect is set to 1 by default (i.e. true).
 */
APU_DECLARE(apr_status_t) apr_dbd_open_ex(const apr_dbd_driver_t *driver,
                                          apr_pool_t *pool, const char *params,
                                          apr_dbd_t **handle,
                                          const char **error);

/** apr_dbd_open: open a connection to a backend
 *
 *  @param driver - driver struct.
 *  @param pool - working pool
 *  @param params - arguments to driver (implementation-dependent)
 *  @param handle - pointer to handle to return
 *  @return APR_SUCCESS for success
 *  @return APR_EGENERAL if driver exists but connection failed
 *  @see apr_dbd_open_ex
 */
APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
                                       apr_pool_t *pool, const char *params,
                                       apr_dbd_t **handle);

/** apr_dbd_close: close a connection to a backend
 *
 *  @param driver - driver struct.
 *  @param handle - handle to close
 *  @return APR_SUCCESS for success or error status
 */
APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver,
                                        apr_dbd_t *handle);

/* apr-function-shaped versions of things */

/** apr_dbd_name: get the name of the driver
 *
 *  @param driver - the driver
 *  @return - name
 */
APU_DECLARE(const char*) apr_dbd_name(const apr_dbd_driver_t *driver);

/** apr_dbd_native_handle: get native database handle of the underlying db
 *
 *  @param driver - the driver
 *  @param handle - apr_dbd handle
 *  @return - native handle
 */
APU_DECLARE(void*) apr_dbd_native_handle(const apr_dbd_driver_t *driver,
                                         apr_dbd_t *handle);

/** check_conn: check status of a database connection
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection to check
 *  @return APR_SUCCESS or error
 */
APU_DECLARE(int) apr_dbd_check_conn(const apr_dbd_driver_t *driver, apr_pool_t *pool,
                                    apr_dbd_t *handle);

/** apr_dbd_set_dbname: select database name.  May be a no-op if not supported.
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param name - the database to select
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_set_dbname(const apr_dbd_driver_t *driver, apr_pool_t *pool,
                                    apr_dbd_t *handle, const char *name);

/** apr_dbd_transaction_start: start a transaction.  May be a no-op.
 *
 *  @param driver - the driver
 *  @param pool - a pool to use for error messages (if any).
 *  @param handle - the db connection
 *  @param trans - ptr to a transaction.  May be null on entry
 *  @return 0 for success or error code
 *  @remarks Note that transaction modes, set by calling
 *  apr_dbd_transaction_mode_set(), will affect all query/select calls within
 *  a transaction. By default, any error in query/select during a transaction
 *  will cause the transaction to inherit the error code and any further
 *  query/select calls will fail immediately. Put transaction in "ignore
 *  errors" mode to avoid that. Use "rollback" mode to do explicit rollback.
 */
APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
                                           apr_pool_t *pool,
                                           apr_dbd_t *handle,
                                           apr_dbd_transaction_t **trans);

/** apr_dbd_transaction_end: end a transaction
 *  (commit on success, rollback on error).
 *  May be a no-op.
 *
 *  @param driver - the driver
 *  @param handle - the db connection
 *  @param trans - the transaction.
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
                                         apr_pool_t *pool,
                                         apr_dbd_transaction_t *trans);

#define APR_DBD_TRANSACTION_COMMIT        0x00  /**< commit the transaction */
#define APR_DBD_TRANSACTION_ROLLBACK      0x01  /**< rollback the transaction */
#define APR_DBD_TRANSACTION_IGNORE_ERRORS 0x02  /**< ignore transaction errors */

/** apr_dbd_transaction_mode_get: get the mode of transaction
 *
 *  @param driver - the driver
 *  @param trans  - the transaction
 *  @return mode of transaction
 */
APU_DECLARE(int) apr_dbd_transaction_mode_get(const apr_dbd_driver_t *driver,
                                              apr_dbd_transaction_t *trans);

/** apr_dbd_transaction_mode_set: set the mode of transaction
 *
 *  @param driver - the driver
 *  @param trans  - the transaction
 *  @param mode   - new mode of the transaction
 *  @return the mode of transaction in force after the call
 */
APU_DECLARE(int) apr_dbd_transaction_mode_set(const apr_dbd_driver_t *driver,
                                              apr_dbd_transaction_t *trans,
                                              int mode);

/** apr_dbd_query: execute an SQL query that doesn't return a result set
 *
 *  @param driver - the driver
 *  @param handle - the connection
 *  @param nrows - number of rows affected.
 *  @param statement - the SQL statement to execute
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver, apr_dbd_t *handle,
                               int *nrows, const char *statement);

/** apr_dbd_select: execute an SQL query that returns a result set
 *
 *  @param driver - the driver
 *  @param pool - pool to allocate the result set
 *  @param handle - the connection
 *  @param res - pointer to result set pointer.  May point to NULL on entry
 *  @param statement - the SQL statement to execute
 *  @param random - 1 to support random access to results (seek any row);
 *                  0 to support only looping through results in order
 *                    (async access - faster)
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver, apr_pool_t *pool,
                                apr_dbd_t *handle, apr_dbd_results_t **res,
                                const char *statement, int random);

/** apr_dbd_num_cols: get the number of columns in a results set
 *
 *  @param driver - the driver
 *  @param res - result set.
 *  @return number of columns
 */
APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
                                  apr_dbd_results_t *res);

/** apr_dbd_num_tuples: get the number of rows in a results set
 *  of a synchronous select
 *
 *  @param driver - the driver
 *  @param res - result set.
 *  @return number of rows, or -1 if the results are asynchronous
 */
APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
                                    apr_dbd_results_t *res);

/** apr_dbd_get_row: get a row from a result set
 *
 *  @param driver - the driver
 *  @param pool - pool to allocate the row
 *  @param res - result set pointer
 *  @param row - pointer to row pointer.  May point to NULL on entry
 *  @param rownum - row number (counting from 1), or -1 for "next row".
 *                  Ignored if random access is not supported.
 *  @return 0 for success, -1 for rownum out of range or data finished
 */
APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver, apr_pool_t *pool,
                                 apr_dbd_results_t *res, apr_dbd_row_t **row,
                                 int rownum);

/** apr_dbd_get_entry: get an entry from a row
 *
 *  @param driver - the driver
 *  @param row - row pointer
 *  @param col - entry number
 *  @return value from the row, or NULL if col is out of bounds.
 */
APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
                                           apr_dbd_row_t *row, int col);

/** apr_dbd_get_name: get an entry name from a result set
 *
 *  @param driver - the driver
 *  @param res - result set pointer
 *  @param col - entry number
 *  @return name of the entry, or NULL if col is out of bounds.
 */
APU_DECLARE(const char*) apr_dbd_get_name(const apr_dbd_driver_t *driver,
                                          apr_dbd_results_t *res, int col);


/** apr_dbd_error: get current error message (if any)
 *
 *  @param driver - the driver
 *  @param handle - the connection
 *  @param errnum - error code from operation that returned an error
 *  @return the database current error message, or message for errnum
 *          (implementation-dependent whether errnum is ignored)
 */
APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
                                       apr_dbd_t *handle, int errnum);

/** apr_dbd_escape: escape a string so it is safe for use in query/select
 *
 *  @param driver - the driver
 *  @param pool - pool to alloc the result from
 *  @param string - the string to escape
 *  @param handle - the connection
 *  @return the escaped, safe string
 */
APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
                                        apr_pool_t *pool, const char *string,
                                        apr_dbd_t *handle);

/** apr_dbd_prepare: prepare a statement
 *
 *  @param driver - the driver
 *  @param pool - pool to alloc the result from
 *  @param handle - the connection
 *  @param query - the SQL query
 *  @param label - A label for the prepared statement.
 *                 use NULL for temporary prepared statements
 *                 (eg within a Request in httpd)
 *  @param statement - statement to prepare.  May point to null on entry.
 *  @return 0 for success or error code
 *  @remarks To specify parameters of the prepared query, use \%s, \%d etc.
 *  (see below for full list) in place of database specific parameter syntax
 *  (e.g.  for PostgreSQL, this would be $1, $2, for SQLite3 this would be ?
 *  etc.).  For instance: "SELECT name FROM customers WHERE name=%s" would be
 *  a query that this function understands.
 *  @remarks Here is the full list of format specifiers that this function
 *  understands and what they map to in SQL: \%hhd (TINY INT), \%hhu (UNSIGNED
 *  TINY INT), \%hd (SHORT), \%hu (UNSIGNED SHORT), \%d (INT), \%u (UNSIGNED
 *  INT), \%ld (LONG), \%lu (UNSIGNED LONG), \%lld (LONG LONG), \%llu
 *  (UNSIGNED LONG LONG), \%f (FLOAT, REAL), \%lf (DOUBLE PRECISION), \%s
 *  (VARCHAR), \%pDt (TEXT), \%pDi (TIME), \%pDd (DATE), \%pDa (DATETIME),
 *  \%pDs (TIMESTAMP), \%pDz (TIMESTAMP WITH TIME ZONE), \%pDb (BLOB), \%pDc
 *  (CLOB) and \%pDn (NULL). Not all databases have support for all these
 *  types, so the underlying driver will attempt the "best match" where
 *  possible. A \% followed by any letter not in the above list will be
 *  interpreted as VARCHAR (i.e. \%s).
 */
APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver, apr_pool_t *pool,
                                 apr_dbd_t *handle, const char *query,
                                 const char *label,
                                 apr_dbd_prepared_t **statement);


/** apr_dbd_pquery: query using a prepared statement + args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param nrows - number of rows affected.
 *  @param statement - the prepared statement to execute
 *  @param nargs - ignored (for backward compatibility only)
 *  @param args - args to prepared statement
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
                                apr_dbd_t *handle, int *nrows,
                                apr_dbd_prepared_t *statement, int nargs,
                                const char **args);

/** apr_dbd_pselect: select using a prepared statement + args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param res - pointer to query results.  May point to NULL on entry
 *  @param statement - the prepared statement to execute
 *  @param random - Whether to support random-access to results
 *  @param nargs - ignored (for backward compatibility only)
 *  @param args - args to prepared statement
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
                                 apr_dbd_t *handle, apr_dbd_results_t **res,
                                 apr_dbd_prepared_t *statement, int random,
                                 int nargs, const char **args);

/** apr_dbd_pvquery: query using a prepared statement + args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param nrows - number of rows affected.
 *  @param statement - the prepared statement to execute
 *  @param ... - varargs list
 *  @return 0 for success or error code
 */
APU_DECLARE_NONSTD(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver, 
                                        apr_pool_t *pool,
                                        apr_dbd_t *handle, int *nrows,
                                        apr_dbd_prepared_t *statement, ...);

/** apr_dbd_pvselect: select using a prepared statement + args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param res - pointer to query results.  May point to NULL on entry
 *  @param statement - the prepared statement to execute
 *  @param random - Whether to support random-access to results
 *  @param ... - varargs list
 *  @return 0 for success or error code
 */
APU_DECLARE_NONSTD(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver,
                                         apr_pool_t *pool, apr_dbd_t *handle,
                                         apr_dbd_results_t **res,
                                         apr_dbd_prepared_t *statement,
                                         int random, ...);

/** apr_dbd_pbquery: query using a prepared statement + binary args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param nrows - number of rows affected.
 *  @param statement - the prepared statement to execute
 *  @param args - binary args to prepared statement
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_pbquery(const apr_dbd_driver_t *driver,
                                 apr_pool_t *pool, apr_dbd_t *handle,
                                 int *nrows, apr_dbd_prepared_t *statement,
                                 const void **args);

/** apr_dbd_pbselect: select using a prepared statement + binary args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param res - pointer to query results.  May point to NULL on entry
 *  @param statement - the prepared statement to execute
 *  @param random - Whether to support random-access to results
 *  @param args - binary args to prepared statement
 *  @return 0 for success or error code
 */
APU_DECLARE(int) apr_dbd_pbselect(const apr_dbd_driver_t *driver,
                                  apr_pool_t *pool,
                                  apr_dbd_t *handle, apr_dbd_results_t **res,
                                  apr_dbd_prepared_t *statement, int random,
                                  const void **args);

/** apr_dbd_pvbquery: query using a prepared statement + binary args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param nrows - number of rows affected.
 *  @param statement - the prepared statement to execute
 *  @param ... - varargs list of binary args
 *  @return 0 for success or error code
 */
APU_DECLARE_NONSTD(int) apr_dbd_pvbquery(const apr_dbd_driver_t *driver,
                                         apr_pool_t *pool,
                                         apr_dbd_t *handle, int *nrows,
                                         apr_dbd_prepared_t *statement, ...);

/** apr_dbd_pvbselect: select using a prepared statement + binary args
 *
 *  @param driver - the driver
 *  @param pool - working pool
 *  @param handle - the connection
 *  @param res - pointer to query results.  May point to NULL on entry
 *  @param statement - the prepared statement to execute
 *  @param random - Whether to support random-access to results
 *  @param ... - varargs list of binary args
 *  @return 0 for success or error code
 */
APU_DECLARE_NONSTD(int) apr_dbd_pvbselect(const apr_dbd_driver_t *driver,
                                          apr_pool_t *pool, apr_dbd_t *handle,
                                          apr_dbd_results_t **res,
                                          apr_dbd_prepared_t *statement,
                                          int random, ...);

/** apr_dbd_datum_get: get a binary entry from a row
 *
 *  @param driver - the driver
 *  @param row - row pointer
 *  @param col - entry number
 *  @param type - type of data to get
 *  @param data - pointer to data, allocated by the caller
 *  @return APR_SUCCESS on success, APR_ENOENT if data is NULL or APR_EGENERAL
 */
APU_DECLARE(apr_status_t) apr_dbd_datum_get(const apr_dbd_driver_t *driver,
                                            apr_dbd_row_t *row, int col,
                                            apr_dbd_type_e type, void *data);

/** @} */

#ifdef __cplusplus
}
#endif

#endif
include/apr-1/apr_uri.h000064400000014675150336140420010734 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * apr_uri.h: External Interface of apr_uri.c
 */

/**
 * @file apr_uri.h
 * @brief APR-UTIL URI Routines
 */

#ifndef APR_URI_H
#define APR_URI_H

#include "apu.h"

#include "apr_network_io.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup APR_Util_URI URI
 * @ingroup APR_Util
 * @{
 */

#define APR_URI_FTP_DEFAULT_PORT         21 /**< default FTP port */
#define APR_URI_SSH_DEFAULT_PORT         22 /**< default SSH port */
#define APR_URI_TELNET_DEFAULT_PORT      23 /**< default telnet port */
#define APR_URI_GOPHER_DEFAULT_PORT      70 /**< default Gopher port */
#define APR_URI_HTTP_DEFAULT_PORT        80 /**< default HTTP port */
#define APR_URI_POP_DEFAULT_PORT        110 /**< default POP port */
#define APR_URI_NNTP_DEFAULT_PORT       119 /**< default NNTP port */
#define APR_URI_IMAP_DEFAULT_PORT       143 /**< default IMAP port */
#define APR_URI_PROSPERO_DEFAULT_PORT   191 /**< default Prospero port */
#define APR_URI_WAIS_DEFAULT_PORT       210 /**< default WAIS port */
#define APR_URI_LDAP_DEFAULT_PORT       389 /**< default LDAP port */
#define APR_URI_HTTPS_DEFAULT_PORT      443 /**< default HTTPS port */
#define APR_URI_RTSP_DEFAULT_PORT       554 /**< default RTSP port */
#define APR_URI_SNEWS_DEFAULT_PORT      563 /**< default SNEWS port */
#define APR_URI_ACAP_DEFAULT_PORT       674 /**< default ACAP port */
#define APR_URI_NFS_DEFAULT_PORT       2049 /**< default NFS port */
#define APR_URI_TIP_DEFAULT_PORT       3372 /**< default TIP port */
#define APR_URI_SIP_DEFAULT_PORT       5060 /**< default SIP port */

/** Flags passed to unparse_uri_components(): */
/** suppress "scheme://user\@site:port" */
#define APR_URI_UNP_OMITSITEPART    (1U<<0)
/** Just omit user */
#define APR_URI_UNP_OMITUSER        (1U<<1)
/** Just omit password */
#define APR_URI_UNP_OMITPASSWORD    (1U<<2)
/** omit "user:password\@" part */
#define APR_URI_UNP_OMITUSERINFO    (APR_URI_UNP_OMITUSER | \
                                     APR_URI_UNP_OMITPASSWORD)
/** Show plain text password (default: show XXXXXXXX) */
#define APR_URI_UNP_REVEALPASSWORD  (1U<<3)
/** Show "scheme://user\@site:port" only */
#define APR_URI_UNP_OMITPATHINFO    (1U<<4)
/** Omit the "?queryarg" from the path */
#define APR_URI_UNP_OMITQUERY       (1U<<5)

/** @see apr_uri_t */
typedef struct apr_uri_t apr_uri_t;

/**
 * A structure to encompass all of the fields in a uri
 */
struct apr_uri_t {
    /** scheme ("http"/"ftp"/...) */
    char *scheme;
    /** combined [user[:password]\@]host[:port] */
    char *hostinfo;
    /** user name, as in http://user:passwd\@host:port/ */
    char *user;
    /** password, as in http://user:passwd\@host:port/ */
    char *password;
    /** hostname from URI (or from Host: header) */
    char *hostname;
    /** port string (integer representation is in "port") */
    char *port_str;
    /** the request path (or NULL if only scheme://host was given) */
    char *path;
    /** Everything after a '?' in the path, if present */
    char *query;
    /** Trailing "#fragment" string, if present */
    char *fragment;

    /** structure returned from gethostbyname() */
    struct hostent *hostent;

    /** The port number, numeric, valid only if port_str != NULL */
    apr_port_t port;
    
    /** has the structure been initialized */
    unsigned is_initialized:1;

    /** has the DNS been looked up yet */
    unsigned dns_looked_up:1;
    /** has the dns been resolved yet */
    unsigned dns_resolved:1;
};

/* apr_uri.c */
/**
 * Return the default port for a given scheme.  The schemes recognized are
 * http, ftp, https, gopher, wais, nntp, snews, and prospero
 * @param scheme_str The string that contains the current scheme
 * @return The default port for this scheme
 */ 
APU_DECLARE(apr_port_t) apr_uri_port_of_scheme(const char *scheme_str);

/**
 * Unparse a apr_uri_t structure to an URI string.  Optionally 
 * suppress the password for security reasons.
 * @param p The pool to allocate out of
 * @param uptr All of the parts of the uri
 * @param flags How to unparse the uri.  One of:
 * <PRE>
 *    APR_URI_UNP_OMITSITEPART        Suppress "scheme://user\@site:port" 
 *    APR_URI_UNP_OMITUSER            Just omit user 
 *    APR_URI_UNP_OMITPASSWORD        Just omit password 
 *    APR_URI_UNP_OMITUSERINFO        Omit "user:password\@" part
 *    APR_URI_UNP_REVEALPASSWORD      Show plain text password (default: show XXXXXXXX)
 *    APR_URI_UNP_OMITPATHINFO        Show "scheme://user\@site:port" only 
 *    APR_URI_UNP_OMITQUERY           Omit "?queryarg" or "#fragment" 
 * </PRE>
 * @return The uri as a string
 */
APU_DECLARE(char *) apr_uri_unparse(apr_pool_t *p, 
                                    const apr_uri_t *uptr,
                                    unsigned flags);

/**
 * Parse a given URI, fill in all supplied fields of a apr_uri_t
 * structure. This eliminates the necessity of extracting host, port,
 * path, query info repeatedly in the modules.
 * @param p The pool to allocate out of
 * @param uri The uri to parse
 * @param uptr The apr_uri_t to fill out
 * @return APR_SUCCESS for success or error code
 */
APU_DECLARE(apr_status_t) apr_uri_parse(apr_pool_t *p, const char *uri, 
                                        apr_uri_t *uptr);

/**
 * Special case for CONNECT parsing: it comes with the hostinfo part only
 * @param p The pool to allocate out of
 * @param hostinfo The hostinfo string to parse
 * @param uptr The apr_uri_t to fill out
 * @return APR_SUCCESS for success or error code
 */
APU_DECLARE(apr_status_t) apr_uri_parse_hostinfo(apr_pool_t *p, 
                                                 const char *hostinfo, 
                                                 apr_uri_t *uptr);

/** @} */
#ifdef __cplusplus
}
#endif

#endif /* APR_URI_H */
include/apr-1/apr_redis.h000064400000037173150336140420011241 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file apr_redis.h
 * @brief Client interface for redis
 * @remark To use this interface you must have a separate redis
 * for more information.
 */

#ifndef APR_REDIS_H
#define APR_REDIS_H

#include "apr.h"
#include "apr_pools.h"
#include "apr_time.h"
#include "apr_strings.h"
#include "apr_network_io.h"
#include "apr_ring.h"
#include "apr_buckets.h"
#include "apr_reslist.h"
#include "apr_hash.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#ifndef RC_DEFAULT_SERVER_PORT
#define RC_DEFAULT_SERVER_PORT 6379
#endif

#ifndef RC_DEFAULT_SERVER_MIN
#define RC_DEFAULT_SERVER_MIN 0
#endif

#ifndef RC_DEFAULT_SERVER_SMAX
#define RC_DEFAULT_SERVER_SMAX 1
#endif

#ifndef RC_DEFAULT_SERVER_TTL
#define RC_DEFAULT_SERVER_TTL 600
#endif

/**
 * @defgroup APR_Util_RC Redis Client Routines
 * @ingroup APR_Util
 * @{
 */

/** Specifies the status of a redis server */
typedef enum
{
    APR_RC_SERVER_LIVE, /**< Server is alive and responding to requests */
    APR_RC_SERVER_DEAD  /**< Server is not responding to requests */
} apr_redis_server_status_t;

/** Opaque redis client connection object */
typedef struct apr_redis_conn_t apr_redis_conn_t;

/** Redis Server Info Object */
typedef struct apr_redis_server_t apr_redis_server_t;
struct apr_redis_server_t
{
    const char *host; /**< Hostname of this Server */
    apr_port_t port; /**< Port of this Server */
    apr_redis_server_status_t status; /**< @see apr_redis_server_status_t */
#if APR_HAS_THREADS || defined(DOXYGEN)
    apr_reslist_t *conns; /**< Resource list of actual client connections */
#else
    apr_redis_conn_t *conn;
#endif
    apr_pool_t *p; /** Pool to use for private allocations */
#if APR_HAS_THREADS
    apr_thread_mutex_t *lock;
#endif
    apr_time_t btime;
    apr_uint32_t rwto;
    struct
    {
        int major;
        int minor;
        int patch;
        char *number;
    } version;
};

typedef struct apr_redis_t apr_redis_t;

/* Custom hash callback function prototype, user for server selection.
* @param baton user selected baton
* @param data data to hash
* @param data_len length of data
*/
typedef apr_uint32_t (*apr_redis_hash_func)(void *baton,
                                            const char *data,
                                            const apr_size_t data_len);
/* Custom Server Select callback function prototype.
* @param baton user selected baton
* @param rc redis instance, use rc->live_servers to select a node
* @param hash hash of the selected key.
*/
typedef apr_redis_server_t* (*apr_redis_server_func)(void *baton,
                                                 apr_redis_t *rc,
                                                 const apr_uint32_t hash);

/** Container for a set of redis servers */
struct apr_redis_t
{
    apr_uint32_t flags; /**< Flags, Not currently used */
    apr_uint16_t nalloc; /**< Number of Servers Allocated */
    apr_uint16_t ntotal; /**< Number of Servers Added */
    apr_redis_server_t **live_servers; /**< Array of Servers */
    apr_pool_t *p; /** Pool to use for allocations */
    void *hash_baton;
    apr_redis_hash_func hash_func;
    void *server_baton;
    apr_redis_server_func server_func;
};

/**
 * Creates a crc32 hash used to split keys between servers
 * @param rc The redis client object to use
 * @param data Data to be hashed
 * @param data_len Length of the data to use
 * @return crc32 hash of data
 * @remark The crc32 hash is not compatible with old redisd clients.
 */
APU_DECLARE(apr_uint32_t) apr_redis_hash(apr_redis_t *rc,
                                         const char *data,
                                         const apr_size_t data_len);

/**
 * Pure CRC32 Hash. Used by some clients.
 */
APU_DECLARE(apr_uint32_t) apr_redis_hash_crc32(void *baton,
                                               const char *data,
                                               const apr_size_t data_len);

/**
 * hash compatible with the standard Perl Client.
 */
APU_DECLARE(apr_uint32_t) apr_redis_hash_default(void *baton,
                                                 const char *data,
                                                 const apr_size_t data_len);

/**
 * Picks a server based on a hash
 * @param rc The redis client object to use
 * @param hash Hashed value of a Key
 * @return server that controls specified hash
 * @see apr_redis_hash
 */
APU_DECLARE(apr_redis_server_t *) apr_redis_find_server_hash(apr_redis_t *rc,
                                                             const apr_uint32_t hash);

/**
 * server selection compatible with the standard Perl Client.
 */
APU_DECLARE(apr_redis_server_t *) apr_redis_find_server_hash_default(void *baton,
                                                                      apr_redis_t *rc,
                                                                      const apr_uint32_t hash);

/**
 * Adds a server to a client object
 * @param rc The redis client object to use
 * @param server Server to add
 * @remark Adding servers is not thread safe, and should be done once at startup.
 * @warning Changing servers after startup may cause keys to go to
 * different servers.
 */
APU_DECLARE(apr_status_t) apr_redis_add_server(apr_redis_t *rc,
                                               apr_redis_server_t *server);


/**
 * Finds a Server object based on a hostname/port pair
 * @param rc The redis client object to use
 * @param host Hostname of the server
 * @param port Port of the server
 * @return Server with matching Hostname and Port, or NULL if none was found.
 */
APU_DECLARE(apr_redis_server_t *) apr_redis_find_server(apr_redis_t *rc,
                                                        const char *host,
                                                        apr_port_t port);

/**
 * Enables a Server for use again
 * @param rc The redis client object to use
 * @param rs Server to Activate
 */
APU_DECLARE(apr_status_t) apr_redis_enable_server(apr_redis_t *rc,
                                                  apr_redis_server_t *rs);


/**
 * Disable a Server
 * @param rc The redis client object to use
 * @param rs Server to Disable
 */
APU_DECLARE(apr_status_t) apr_redis_disable_server(apr_redis_t *rc,
                                                   apr_redis_server_t *rs);

/**
 * Creates a new Server Object
 * @param p Pool to use
 * @param host hostname of the server
 * @param port port of the server
 * @param min  minimum number of client sockets to open
 * @param smax soft maximum number of client connections to open
 * @param max  hard maximum number of client connections
 * @param ttl  time to live in microseconds of a client connection
 * @param rwto r/w timeout value in seconds of a client connection
 * @param ns   location of the new server object
 * @see apr_reslist_create
 * @remark min, smax, and max are only used when APR_HAS_THREADS
 */
APU_DECLARE(apr_status_t) apr_redis_server_create(apr_pool_t *p,
                                                  const char *host,
                                                  apr_port_t port,
                                                  apr_uint32_t min,
                                                  apr_uint32_t smax,
                                                  apr_uint32_t max,
                                                  apr_uint32_t ttl,
                                                  apr_uint32_t rwto,
                                                  apr_redis_server_t **ns);
/**
 * Creates a new redisd client object
 * @param p Pool to use
 * @param max_servers maximum number of servers
 * @param flags Not currently used
 * @param rc   location of the new redis client object
 */
APU_DECLARE(apr_status_t) apr_redis_create(apr_pool_t *p,
                                           apr_uint16_t max_servers,
                                           apr_uint32_t flags,
                                           apr_redis_t **rc);

/**
 * Gets a value from the server, allocating the value out of p
 * @param rc client to use
 * @param p Pool to use
 * @param key null terminated string containing the key
 * @param baton location of the allocated value
 * @param len   length of data at baton
 * @param flags any flags set by the client for this key
 * @return 
 */
APU_DECLARE(apr_status_t) apr_redis_getp(apr_redis_t *rc,
                                         apr_pool_t *p,
                                         const char* key,
                                         char **baton,
                                         apr_size_t *len,
                                         apr_uint16_t *flags);

/**
 * Sets a value by key on the server
 * @param rc client to use
 * @param key   null terminated string containing the key
 * @param baton data to store on the server
 * @param data_size   length of data at baton
 * @param flags any flags set by the client for this key
 */
APU_DECLARE(apr_status_t) apr_redis_set(apr_redis_t *rc,
                                        const char *key,
                                        char *baton,
                                        const apr_size_t data_size,
                                        apr_uint16_t flags);

/**
 * Sets a value by key on the server
 * @param rc client to use
 * @param key   null terminated string containing the key
 * @param baton data to store on the server
 * @param data_size   length of data at baton
 * @param timeout time in seconds for the data to live on the server
 * @param flags any flags set by the client for this key
 */
APU_DECLARE(apr_status_t) apr_redis_setex(apr_redis_t *rc,
                                          const char *key,
                                          char *baton,
                                          const apr_size_t data_size,
                                          apr_uint32_t timeout,
                                          apr_uint16_t flags);

/**
 * Deletes a key from a server
 * @param rc client to use
 * @param key   null terminated string containing the key
 * @param timeout time for the delete to stop other clients from adding
 */
APU_DECLARE(apr_status_t) apr_redis_delete(apr_redis_t *rc,
                                           const char *key,
                                           apr_uint32_t timeout);

/**
 * Query a server's version
 * @param rs    server to query
 * @param p     Pool to allocate answer from
 * @param baton location to store server version string
 */
APU_DECLARE(apr_status_t) apr_redis_version(apr_redis_server_t *rs,
                                            apr_pool_t *p,
                                            char **baton);

/**
 * Query a server's INFO
 * @param rs    server to query
 * @param p     Pool to allocate answer from
 * @param baton location to store server INFO response string
 */
APU_DECLARE(apr_status_t) apr_redis_info(apr_redis_server_t *rs,
                                         apr_pool_t *p,
                                         char **baton);

/**
 * Increments a value
 * @param rc client to use
 * @param key   null terminated string containing the key
 * @param inc     number to increment by
 * @param new_value    new value after incrementing
 */
APU_DECLARE(apr_status_t) apr_redis_incr(apr_redis_t *rc,
                                         const char *key,
                                         apr_int32_t inc,
                                         apr_uint32_t *new_value);
/**
 * Decrements a value
 * @param rc client to use
 * @param key   null terminated string containing the key
 * @param inc     number to decrement by
 * @param new_value    new value after decrementing
 */
APU_DECLARE(apr_status_t) apr_redis_decr(apr_redis_t *rc,
                                         const char *key,
                                         apr_int32_t inc,
                                         apr_uint32_t *new_value);


/**
 * Pings the server
 * @param rs Server to ping
 */
APU_DECLARE(apr_status_t) apr_redis_ping(apr_redis_server_t *rs);

/**
 * Gets multiple values from the server, allocating the values out of p
 * @param rc client to use
 * @param temp_pool Pool used for temporary allocations. May be cleared inside this
 *        call.
 * @param data_pool Pool used to allocate data for the returned values.
 * @param values hash of apr_redis_value_t keyed by strings, contains the
 *        result of the multiget call.
 * @return
 */
APU_DECLARE(apr_status_t) apr_redis_multgetp(apr_redis_t *rc,
                                             apr_pool_t *temp_pool,
                                             apr_pool_t *data_pool,
                                             apr_hash_t *values);

typedef enum
{
    APR_RS_SERVER_MASTER, /**< Server is a master */
    APR_RS_SERVER_SLAVE,  /**< Server is a slave */
    APR_RS_SERVER_UNKNOWN  /**< Server role is unknown */
} apr_redis_server_role_t;

typedef struct
{
/* # Server */
    /** Major version number of this server */
    apr_uint32_t major;
    /** Minor version number of this server */
    apr_uint32_t minor;
    /** Patch version number of this server */
    apr_uint32_t patch;
    /** Process id of this server process */
    apr_uint32_t process_id;
    /** Number of seconds this server has been running */
    apr_uint32_t uptime_in_seconds;
    /** Bitsize of the arch on the current machine */
    apr_uint32_t arch_bits;

/* # Clients */
    /** Number of connected clients */
    apr_uint32_t connected_clients;
    /** Number of blocked clients */
    apr_uint32_t blocked_clients;

/* # Memory */
    /** Max memory of this server */
    apr_uint64_t maxmemory;
    /** Amount of used memory */
    apr_uint64_t used_memory;
    /** Total memory available on this server */
    apr_uint64_t total_system_memory;

/* # Stats */
    /** Total connections received */
    apr_uint64_t total_connections_received;
    /** Total commands processed */
    apr_uint64_t total_commands_processed;
    /** Total commands rejected */
    apr_uint64_t rejected_connections;
    /** Total net input bytes */
    apr_uint64_t total_net_input_bytes;
    /** Total net output bytes */
    apr_uint64_t total_net_output_bytes;
    /** Keyspace hits */
    apr_uint64_t keyspace_hits;
    /** Keyspace misses */
    apr_uint64_t keyspace_misses;

/* # Replication */
    /** Role */
    apr_redis_server_role_t role;
    /** Number of connected slave */
    apr_uint32_t connected_slaves;

/* # CPU */
    /** Accumulated CPU user time for this process */
    apr_uint32_t used_cpu_sys;
    /** Accumulated CPU system time for this process */
    apr_uint32_t used_cpu_user;

/* # Cluster */
    /** Is cluster enabled */
    apr_uint32_t cluster_enabled;
} apr_redis_stats_t;

/**
 * Query a server for statistics
 * @param rs    server to query
 * @param p     Pool to allocate answer from
 * @param stats location of the new statistics structure
 */
APU_DECLARE(apr_status_t) apr_redis_stats(apr_redis_server_t *rs,
                                          apr_pool_t *p,
                                          apr_redis_stats_t **stats);

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* APR_REDIS_H */
include/apr-1/apr_md5.h000064400000014316150336140420010612 0ustar00/*
 * This is work is derived from material Copyright RSA Data Security, Inc.
 *
 * The RSA copyright statement and Licence for that original material is
 * included below. This is followed by the Apache copyright statement and
 * licence for the modifications made to that material.
 */

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
   rights reserved.

   License to copy and use this software is granted provided that it
   is identified as the "RSA Data Security, Inc. MD5 Message-Digest
   Algorithm" in all material mentioning or referencing this software
   or this function.

   License is also granted to make and use derivative works provided
   that such works are identified as "derived from the RSA Data
   Security, Inc. MD5 Message-Digest Algorithm" in all material
   mentioning or referencing the derived work.

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

   These notices must be retained in any copies of any part of this
   documentation and/or software.
 */

/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_MD5_H
#define APR_MD5_H

#include "apu.h"
#include "apr_xlate.h"

#ifdef __cplusplus
extern "C" {
#endif
/**
 * @file apr_md5.h
 * @brief APR MD5 Routines
 */

/**
 * @defgroup APR_MD5 MD5 Routines
 * @ingroup APR
 * @{
 */

/** The MD5 digest size */
#define APR_MD5_DIGESTSIZE 16

/** @see apr_md5_ctx_t */
typedef struct apr_md5_ctx_t apr_md5_ctx_t;

/** MD5 context. */
struct apr_md5_ctx_t {
    /** state (ABCD) */
    apr_uint32_t state[4];
    /** number of bits, modulo 2^64 (lsb first) */
    apr_uint32_t count[2];
    /** input buffer */
    unsigned char buffer[64];
    /** translation handle 
     *  ignored if xlate is unsupported
     */
    apr_xlate_t *xlate;
};

/**
 * MD5 Initialize.  Begins an MD5 operation, writing a new context.
 * @param context The MD5 context to initialize.
 */
APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context);

/**
 * MD5 translation setup.  Provides the APR translation handle to be used 
 * for translating the content before calculating the digest.
 * @param context The MD5 content to set the translation for.
 * @param xlate The translation handle to use for this MD5 context 
 */
APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
                                            apr_xlate_t *xlate);

/**
 * MD5 block update operation.  Continue an MD5 message-digest operation, 
 * processing another message block, and updating the context.
 * @param context The MD5 content to update.
 * @param input next message block to update
 * @param inputLen The length of the next message block
 */
APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
                                         const void *input,
                                         apr_size_t inputLen);

/**
 * MD5 finalization.  Ends an MD5 message-digest operation, writing the 
 * message digest and zeroing the context
 * @param digest The final MD5 digest
 * @param context The MD5 content we are finalizing.
 */
APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
                                        apr_md5_ctx_t *context);

/**
 * MD5 in one step
 * @param digest The final MD5 digest
 * @param input The message block to use
 * @param inputLen The length of the message block
 */
APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
                                  const void *input,
                                  apr_size_t inputLen);

/**
 * Encode a password using an MD5 algorithm
 * @param password The password to encode
 * @param salt The salt string to use for the encoding
 * @param result The string to store the encoded password in
 * @param nbytes The size of the result buffer
 */
APU_DECLARE(apr_status_t) apr_md5_encode(const char *password, const char *salt,
                                         char *result, apr_size_t nbytes);

/**
 * Encode a password using the bcrypt algorithm
 * @param password The password to encode
 * @param count The cost of the encoding, possible values are 4 to 31
 * @param salt Pointer to binary data to be used as salt for the encoding
 * @param salt_len The size of the salt data (must be >= 16)
 * @param out The string to store the encoded password in
 * @param out_len The size of the result buffer (must be >= 61)
 */
APU_DECLARE(apr_status_t) apr_bcrypt_encode(const char *pw,
                                            unsigned int count,
                                            const unsigned char *salt,
                                            apr_size_t salt_len,
                                            char *out, apr_size_t out_len);

/**
 * Validate hashes created by APR-supported algorithms: md5, bcrypt, and sha1.
 * hashes created by crypt are supported only on platforms that provide
 * crypt(3), so don't rely on that function unless you know that your
 * application will be run only on platforms that support it.  On platforms
 * that don't support crypt(3), this falls back to a clear text string
 * comparison.
 * @param passwd The password to validate
 * @param hash The password to validate against
 */
APU_DECLARE(apr_status_t) apr_password_validate(const char *passwd, 
                                                const char *hash);


/** @} */
#ifdef __cplusplus
}
#endif

#endif /* !APR_MD5_H */
include/apr-1/apr_sdbm.h000064400000013741150336140420011053 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * sdbm - ndbm work-alike hashed database library
 * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
 * author: oz@nexus.yorku.ca
 * status: ex-public domain
 */

#ifndef APR_SDBM_H
#define APR_SDBM_H

#include "apu.h"
#include "apr_errno.h"
#include "apr_file_io.h"   /* for apr_fileperms_t */

/** 
 * @file apr_sdbm.h
 * @brief apr-util SDBM library
 */
/**
 * @defgroup APR_Util_DBM_SDBM SDBM library
 * @ingroup APR_Util_DBM
 * @{
 */

/**
 * Structure for referencing an sdbm
 */
typedef struct apr_sdbm_t apr_sdbm_t;

/**
 * Structure for referencing the datum record within an sdbm
 */
typedef struct {
    /** pointer to the data stored/retrieved */
    char *dptr;
    /** size of data */
    /* apr_ssize_t for release 2.0??? */
    int dsize;
} apr_sdbm_datum_t;

/* The extensions used for the database files */
/** SDBM Directory file extension */
#define APR_SDBM_DIRFEXT	".dir"
/** SDBM page file extension */
#define APR_SDBM_PAGFEXT	".pag"

/* flags to sdbm_store */
#define APR_SDBM_INSERT     0   /**< Insert */
#define APR_SDBM_REPLACE    1   /**< Replace */
#define APR_SDBM_INSERTDUP  2   /**< Insert with duplicates */

/**
 * Open an sdbm database by file name
 * @param db The newly opened database
 * @param name The sdbm file to open
 * @param mode The flag values (APR_READ and APR_BINARY flags are implicit)
 * <PRE>
 *           APR_WRITE          open for read-write access
 *           APR_CREATE         create the sdbm if it does not exist
 *           APR_TRUNCATE       empty the contents of the sdbm
 *           APR_EXCL           fail for APR_CREATE if the file exists
 *           APR_DELONCLOSE     delete the sdbm when closed
 *           APR_SHARELOCK      support locking across process/machines
 * </PRE>
 * @param perms Permissions to apply to if created
 * @param p The pool to use when creating the sdbm
 * @remark The sdbm name is not a true file name, as sdbm appends suffixes 
 * for seperate data and index files.
 */
APU_DECLARE(apr_status_t) apr_sdbm_open(apr_sdbm_t **db, const char *name, 
                                        apr_int32_t mode, 
                                        apr_fileperms_t perms, apr_pool_t *p);

/**
 * Close an sdbm file previously opened by apr_sdbm_open
 * @param db The database to close
 */
APU_DECLARE(apr_status_t) apr_sdbm_close(apr_sdbm_t *db);

/**
 * Lock an sdbm database for concurency of multiple operations
 * @param db The database to lock
 * @param type The lock type
 * <PRE>
 *           APR_FLOCK_SHARED
 *           APR_FLOCK_EXCLUSIVE
 * </PRE>
 * @remark Calls to apr_sdbm_lock may be nested.  All apr_sdbm functions
 * perform implicit locking.  Since an APR_FLOCK_SHARED lock cannot be 
 * portably promoted to an APR_FLOCK_EXCLUSIVE lock, apr_sdbm_store and 
 * apr_sdbm_delete calls will fail if an APR_FLOCK_SHARED lock is held.
 * The apr_sdbm_lock call requires the database to be opened with the
 * APR_SHARELOCK mode value.
 */
APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type);

/**
 * Release an sdbm lock previously aquired by apr_sdbm_lock
 * @param db The database to unlock
 */
APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db);

/**
 * Fetch an sdbm record value by key
 * @param db The database 
 * @param value The value datum retrieved for this record
 * @param key The key datum to find this record
 */
APU_DECLARE(apr_status_t) apr_sdbm_fetch(apr_sdbm_t *db, 
                                         apr_sdbm_datum_t *value, 
                                         apr_sdbm_datum_t key);

/**
 * Store an sdbm record value by key
 * @param db The database 
 * @param key The key datum to store this record by
 * @param value The value datum to store in this record
 * @param opt The method used to store the record
 * <PRE>
 *           APR_SDBM_INSERT     return an error if the record exists
 *           APR_SDBM_REPLACE    overwrite any existing record for key
 * </PRE>
 */
APU_DECLARE(apr_status_t) apr_sdbm_store(apr_sdbm_t *db, apr_sdbm_datum_t key,
                                         apr_sdbm_datum_t value, int opt);

/**
 * Delete an sdbm record value by key
 * @param db The database 
 * @param key The key datum of the record to delete
 * @remark It is not an error to delete a non-existent record.
 */
APU_DECLARE(apr_status_t) apr_sdbm_delete(apr_sdbm_t *db, 
                                          const apr_sdbm_datum_t key);

/**
 * Retrieve the first record key from a dbm
 * @param db The database 
 * @param key The key datum of the first record
 * @remark The keys returned are not ordered.  To traverse the list of keys
 * for an sdbm opened with APR_SHARELOCK, the caller must use apr_sdbm_lock
 * prior to retrieving the first record, and hold the lock until after the
 * last call to apr_sdbm_nextkey.
 */
APU_DECLARE(apr_status_t) apr_sdbm_firstkey(apr_sdbm_t *db, apr_sdbm_datum_t *key);

/**
 * Retrieve the next record key from an sdbm
 * @param db The database 
 * @param key The key datum of the next record
 */
APU_DECLARE(apr_status_t) apr_sdbm_nextkey(apr_sdbm_t *db, apr_sdbm_datum_t *key);

/**
 * Returns true if the sdbm database opened for read-only access
 * @param db The database to test
 */
APU_DECLARE(int) apr_sdbm_rdonly(apr_sdbm_t *db);
/** @} */
#endif /* APR_SDBM_H */
include/apr-1/apu_errno.h000064400000012504150336140420011252 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APU_ERRNO_H
#define APU_ERRNO_H

/**
 * @file apu_errno.h
 * @brief APR-Util Error Codes
 */

#include "apr.h"
#include "apr_errno.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apu_errno Error Codes
 * @ingroup APR_Util
 * @{
 */

/**
 * @defgroup APR_Util_Error APR_Util Error Values
 * <PRE>
 * <b>APU ERROR VALUES</b>
 * APR_ENOKEY         The key provided was empty or NULL
 * APR_ENOIV          The initialisation vector provided was NULL
 * APR_EKEYTYPE       The key type was not recognised
 * APR_ENOSPACE       The buffer supplied was not big enough
 * APR_ECRYPT         An error occurred while encrypting or decrypting
 * APR_EPADDING       Padding was not supported
 * APR_EKEYLENGTH     The key length was incorrect
 * APR_ENOCIPHER      The cipher provided was not recognised
 * APR_ENODIGEST      The digest provided was not recognised
 * APR_ENOENGINE      The engine provided was not recognised
 * APR_EINITENGINE    The engine could not be initialised
 * APR_EREINIT        Underlying crypto has already been initialised
 * </PRE>
 *
 * <PRE>
 * <b>APR STATUS VALUES</b>
 * APR_INCHILD        Program is currently executing in the child
 * </PRE>
 * @{
 */
/** @see APR_STATUS_IS_ENOKEY */
#define APR_ENOKEY           (APR_UTIL_START_STATUS + 1)
/** @see APR_STATUS_IS_ENOIV */
#define APR_ENOIV            (APR_UTIL_START_STATUS + 2)
/** @see APR_STATUS_IS_EKEYTYPE */
#define APR_EKEYTYPE         (APR_UTIL_START_STATUS + 3)
/** @see APR_STATUS_IS_ENOSPACE */
#define APR_ENOSPACE         (APR_UTIL_START_STATUS + 4)
/** @see APR_STATUS_IS_ECRYPT */
#define APR_ECRYPT           (APR_UTIL_START_STATUS + 5)
/** @see APR_STATUS_IS_EPADDING */
#define APR_EPADDING         (APR_UTIL_START_STATUS + 6)
/** @see APR_STATUS_IS_EKEYLENGTH */
#define APR_EKEYLENGTH       (APR_UTIL_START_STATUS + 7)
/** @see APR_STATUS_IS_ENOCIPHER */
#define APR_ENOCIPHER        (APR_UTIL_START_STATUS + 8)
/** @see APR_STATUS_IS_ENODIGEST */
#define APR_ENODIGEST        (APR_UTIL_START_STATUS + 9)
/** @see APR_STATUS_IS_ENOENGINE */
#define APR_ENOENGINE        (APR_UTIL_START_STATUS + 10)
/** @see APR_STATUS_IS_EINITENGINE */
#define APR_EINITENGINE      (APR_UTIL_START_STATUS + 11)
/** @see APR_STATUS_IS_EREINIT */
#define APR_EREINIT          (APR_UTIL_START_STATUS + 12)
/** @} */

/**
 * @defgroup APU_STATUS_IS Status Value Tests
 * @warning For any particular error condition, more than one of these tests
 *      may match. This is because platform-specific error codes may not
 *      always match the semantics of the POSIX codes these tests (and the
 *      corresponding APR error codes) are named after. A notable example
 *      are the APR_STATUS_IS_ENOENT and APR_STATUS_IS_ENOTDIR tests on
 *      Win32 platforms. The programmer should always be aware of this and
 *      adjust the order of the tests accordingly.
 * @{
 */

/** @} */

/**
 * @addtogroup APR_Util_Error
 * @{
 */
/**
 * The key was empty or not provided
 */
#define APR_STATUS_IS_ENOKEY(s)        ((s) == APR_ENOKEY)
/**
 * The initialisation vector was not provided
 */
#define APR_STATUS_IS_ENOIV(s)        ((s) == APR_ENOIV)
/**
 * The key type was not recognised
 */
#define APR_STATUS_IS_EKEYTYPE(s)        ((s) == APR_EKEYTYPE)
/**
 * The buffer provided was not big enough
 */
#define APR_STATUS_IS_ENOSPACE(s)        ((s) == APR_ENOSPACE)
/**
 * An error occurred while encrypting or decrypting
 */
#define APR_STATUS_IS_ECRYPT(s)        ((s) == APR_ECRYPT)
/**
 * An error occurred while padding
 */
#define APR_STATUS_IS_EPADDING(s)        ((s) == APR_EPADDING)
/**
 * An error occurred with the key length
 */
#define APR_STATUS_IS_EKEYLENGTH(s)        ((s) == APR_EKEYLENGTH)
/**
 * The cipher provided was not recognised
 */
#define APR_STATUS_IS_ENOCIPHER(s)        ((s) == APR_ENOCIPHER)
/**
 * The digest provided was not recognised
 */
#define APR_STATUS_IS_ENODIGEST(s)        ((s) == APR_ENODIGEST)
/**
 * The engine provided was not recognised
 */
#define APR_STATUS_IS_ENOENGINE(s)        ((s) == APR_ENOENGINE)
/**
 * The engine could not be initialised
 */
#define APR_STATUS_IS_EINITENGINE(s)        ((s) == APR_EINITENGINE)
/**
 * Crypto has already been initialised
 */
#define APR_STATUS_IS_EREINIT(s)        ((s) == APR_EREINIT)
/** @} */

/**
 * This structure allows the underlying API error codes to be returned
 * along with plain text error messages that explain to us mere mortals
 * what really happened.
 */
typedef struct apu_err_t {
    const char *reason;
    const char *msg;
    int rc;
} apu_err_t;

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APU_ERRNO_H */
include/apr-1/apu.h000064400000010336150336140420010046 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * apu.h is generated from apu.h.in by configure -- do not edit apu.h
 */
/* @file apu.h
 * @brief APR-Utility main file
 */
/**
 * @defgroup APR_Util APR Utility Functions
 * @{
 */


#ifndef APU_H
#define APU_H

/**
 * APU_DECLARE_EXPORT is defined when building the APR-UTIL dynamic library,
 * so that all public symbols are exported.
 *
 * APU_DECLARE_STATIC is defined when including the APR-UTIL public headers,
 * to provide static linkage when the dynamic library may be unavailable.
 *
 * APU_DECLARE_STATIC and APU_DECLARE_EXPORT are left undefined when
 * including the APR-UTIL public headers, to import and link the symbols from 
 * the dynamic APR-UTIL library and assure appropriate indirection and calling
 * conventions at compile time.
 */

#if defined(DOXYGEN) || !defined(WIN32)
/**
 * The public APR-UTIL functions are declared with APU_DECLARE(), so they may
 * use the most appropriate calling convention.  Public APR functions with 
 * variable arguments must use APU_DECLARE_NONSTD().
 *
 * @fn APU_DECLARE(rettype) apr_func(args);
 */
#define APU_DECLARE(type)            type
/**
 * The public APR-UTIL functions using variable arguments are declared with 
 * APU_DECLARE_NONSTD(), as they must use the C language calling convention.
 *
 * @fn APU_DECLARE_NONSTD(rettype) apr_func(args, ...);
 */
#define APU_DECLARE_NONSTD(type)     type
/**
 * The public APR-UTIL variables are declared with APU_DECLARE_DATA.
 * This assures the appropriate indirection is invoked at compile time.
 *
 * @fn APU_DECLARE_DATA type apr_variable;
 * @note APU_DECLARE_DATA extern type apr_variable; syntax is required for
 * declarations within headers to properly import the variable.
 */
#define APU_DECLARE_DATA
#elif defined(APU_DECLARE_STATIC)
#define APU_DECLARE(type)            type __stdcall
#define APU_DECLARE_NONSTD(type)     type __cdecl
#define APU_DECLARE_DATA
#elif defined(APU_DECLARE_EXPORT)
#define APU_DECLARE(type)            __declspec(dllexport) type __stdcall
#define APU_DECLARE_NONSTD(type)     __declspec(dllexport) type __cdecl
#define APU_DECLARE_DATA             __declspec(dllexport)
#else
#define APU_DECLARE(type)            __declspec(dllimport) type __stdcall
#define APU_DECLARE_NONSTD(type)     __declspec(dllimport) type __cdecl
#define APU_DECLARE_DATA             __declspec(dllimport)
#endif

#if !defined(WIN32) || defined(APU_MODULE_DECLARE_STATIC)
/**
 * Declare a dso module's exported module structure as APU_MODULE_DECLARE_DATA.
 *
 * Unless APU_MODULE_DECLARE_STATIC is defined at compile time, symbols 
 * declared with APU_MODULE_DECLARE_DATA are always exported.
 * @code
 * module APU_MODULE_DECLARE_DATA mod_tag
 * @endcode
 */
#define APU_MODULE_DECLARE_DATA
#else
#define APU_MODULE_DECLARE_DATA           __declspec(dllexport)
#endif

/*
 * we always have SDBM (it's in our codebase)
 */
#define APU_HAVE_SDBM   1
#define APU_HAVE_GDBM   0
#define APU_HAVE_NDBM   0
#define APU_HAVE_DB     1

#if APU_HAVE_DB
#define APU_HAVE_DB_VERSION    5
#endif

#define APU_HAVE_PGSQL         1
#define APU_HAVE_MYSQL         1
#define APU_HAVE_SQLITE3       1
#define APU_HAVE_SQLITE2       0
#define APU_HAVE_ORACLE        0
#define APU_HAVE_ODBC          1

#define APU_HAVE_CRYPTO        1
#define APU_HAVE_OPENSSL       1
#define APU_HAVE_NSS           1
#define APU_HAVE_COMMONCRYPTO  0

#define APU_HAVE_APR_ICONV     0
#define APU_HAVE_ICONV         1
#define APR_HAS_XLATE          (APU_HAVE_APR_ICONV || APU_HAVE_ICONV)

#endif /* APU_H */
/** @} */
include/apr-1/apr_random.h000064400000011654150336140420011407 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_RANDOM_H
#define APR_RANDOM_H

/**
 * @file apr_random.h
 * @brief APR PRNG routines
 */

#include "apr_pools.h"
#include "apr_thread_proc.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_random PRNG Routines
 * @ingroup APR
 * @{
 */

typedef struct apr_crypto_hash_t apr_crypto_hash_t;

typedef void apr_crypto_hash_init_t(apr_crypto_hash_t *hash);
typedef void apr_crypto_hash_add_t(apr_crypto_hash_t *hash, const void *data,
                                   apr_size_t bytes);
typedef void apr_crypto_hash_finish_t(apr_crypto_hash_t *hash,
                                      unsigned char *result);


/* FIXME: make this opaque */
struct apr_crypto_hash_t {
    apr_crypto_hash_init_t *init;
    apr_crypto_hash_add_t *add;
    apr_crypto_hash_finish_t *finish;
    apr_size_t size;
    void *data;
};

/**
 * Allocate and initialize the SHA-256 context
 * @param p The pool to allocate from
 */
APR_DECLARE(apr_crypto_hash_t *) apr_crypto_sha256_new(apr_pool_t *p);

/** Opaque PRNG structure. */
typedef struct apr_random_t apr_random_t;

/**
 * Initialize a PRNG state
 * @param g The PRNG state
 * @param p The pool to allocate from
 * @param pool_hash Pool hash functions
 * @param key_hash Key hash functions
 * @param prng_hash PRNG hash functions
 */
APR_DECLARE(void) apr_random_init(apr_random_t *g, apr_pool_t *p,
                                  apr_crypto_hash_t *pool_hash,
                                  apr_crypto_hash_t *key_hash,
                                  apr_crypto_hash_t *prng_hash);
/**
 * Allocate and initialize (apr_crypto_sha256_new) a new PRNG state.
 * @param p The pool to allocate from
 */
APR_DECLARE(apr_random_t *) apr_random_standard_new(apr_pool_t *p);

/**
 * Mix the randomness pools.
 * @param g The PRNG state
 * @param entropy_ Entropy buffer
 * @param bytes Length of entropy_ in bytes
 */
APR_DECLARE(void) apr_random_add_entropy(apr_random_t *g,
                                         const void *entropy_,
                                         apr_size_t bytes);
/**
 * Generate cryptographically insecure random bytes.
 * @param g The RNG state
 * @param random Buffer to fill with random bytes
 * @param bytes Length of buffer in bytes
 */
APR_DECLARE(apr_status_t) apr_random_insecure_bytes(apr_random_t *g,
                                                    void *random,
                                                    apr_size_t bytes);

/**
 * Generate cryptographically secure random bytes.
 * @param g The RNG state
 * @param random Buffer to fill with random bytes
 * @param bytes Length of buffer in bytes
 */
APR_DECLARE(apr_status_t) apr_random_secure_bytes(apr_random_t *g,
                                                  void *random,
                                                  apr_size_t bytes);
/**
 * Ensures that E bits of conditional entropy are mixed into the PRNG
 * before any further randomness is extracted.
 * @param g The RNG state
 */
APR_DECLARE(void) apr_random_barrier(apr_random_t *g);

/**
 * Return APR_SUCCESS if the cryptographic PRNG has been seeded with
 * enough data, APR_ENOTENOUGHENTROPY otherwise.
 * @param r The RNG state
 */
APR_DECLARE(apr_status_t) apr_random_secure_ready(apr_random_t *r);

/**
 * Return APR_SUCCESS if the PRNG has been seeded with enough data,
 * APR_ENOTENOUGHENTROPY otherwise.
 * @param r The PRNG state
 */
APR_DECLARE(apr_status_t) apr_random_insecure_ready(apr_random_t *r);

/**
 * Mix the randomness pools after forking.
 * @param proc The resulting process handle from apr_proc_fork()
 * @remark Call this in the child after forking to mix the randomness
 * pools. Note that its generally a bad idea to fork a process with a
 * real PRNG in it - better to have the PRNG externally and get the
 * randomness from there. However, if you really must do it, then you
 * should supply all your entropy to all the PRNGs - don't worry, they
 * won't produce the same output.
 * @remark Note that apr_proc_fork() calls this for you, so only weird
 * applications need ever call it themselves.
 * @internal
 */
APR_DECLARE(void) apr_random_after_fork(apr_proc_t *proc);

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* !APR_RANDOM_H */
include/apr-1/apr_signal.h000064400000005311150336140420011375 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_SIGNAL_H
#define APR_SIGNAL_H

/**
 * @file apr_signal.h
 * @brief APR Signal Handling
 */

#include "apr.h"
#include "apr_pools.h"

#if APR_HAVE_SIGNAL_H
#include <signal.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_signal Signal Handling
 * @ingroup APR
 * @{
 */

#if APR_HAVE_SIGACTION || defined(DOXYGEN)

#if defined(DARWIN) && !defined(__cplusplus) && !defined(_ANSI_SOURCE)
/* work around Darwin header file bugs
 *   http://www.opensource.apple.com/bugs/X/BSD%20Kernel/2657228.html
 */
#undef SIG_DFL
#undef SIG_IGN
#undef SIG_ERR
#define SIG_DFL (void (*)(int))0
#define SIG_IGN (void (*)(int))1
#define SIG_ERR (void (*)(int))-1
#endif

/** Function prototype for signal handlers */
typedef void apr_sigfunc_t(int);

/**
 * Set the signal handler function for a given signal
 * @param signo The signal (eg... SIGWINCH)
 * @param func the function to get called
 */
APR_DECLARE(apr_sigfunc_t *) apr_signal(int signo, apr_sigfunc_t * func);

#if defined(SIG_IGN) && !defined(SIG_ERR)
#define SIG_ERR ((apr_sigfunc_t *) -1)
#endif

#else /* !APR_HAVE_SIGACTION */
#define apr_signal(a, b) signal(a, b)
#endif


/**
 * Get the description for a specific signal number
 * @param signum The signal number
 * @return The description of the signal
 */
APR_DECLARE(const char *) apr_signal_description_get(int signum);

/**
 * APR-private function for initializing the signal package
 * @internal
 * @param pglobal The internal, global pool
 */
void apr_signal_init(apr_pool_t *pglobal);

/**
 * Block the delivery of a particular signal
 * @param signum The signal number
 * @return status
 */
APR_DECLARE(apr_status_t) apr_signal_block(int signum);

/**
 * Enable the delivery of a particular signal
 * @param signum The signal number
 * @return status
 */
APR_DECLARE(apr_status_t) apr_signal_unblock(int signum);

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* APR_SIGNAL_H */
include/apr-1/apr_perms_set.h000064400000003565150336140420012132 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_PERMS_SET_H
#define APR_PERMS_SET_H

/**
 * @file apr_perms_set.h
 * @brief APR Process Locking Routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_user.h"
#include "apr_file_info.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_perms_set Object permission set functions
 * @ingroup APR 
 * @{
 */

/** Permission set callback function. */
typedef apr_status_t (apr_perms_setfn_t)(void *object, apr_fileperms_t perms,
                                         apr_uid_t uid, apr_gid_t gid);

#define APR_PERMS_SET_IMPLEMENT(type) \
    APR_DECLARE(apr_status_t) apr_##type##_perms_set \
        (void *the##type, apr_fileperms_t perms, \
         apr_uid_t uid, apr_gid_t gid)

#define APR_PERMS_SET_ENOTIMPL(type) \
    APR_DECLARE(apr_status_t) apr_##type##_perms_set \
        (void *the##type, apr_fileperms_t perms, \
         apr_uid_t uid, apr_gid_t gid) \
        { return APR_ENOTIMPL ; }

#define APR_PERMS_SET_FN(type) apr_##type##_perms_set


/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_PERMS_SET */
include/apr-1/apr_general.h000064400000016531150336140420011543 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_GENERAL_H
#define APR_GENERAL_H

/**
 * @file apr_general.h
 * This is collection of oddballs that didn't fit anywhere else,
 * and might move to more appropriate headers with the release
 * of APR 1.0.
 * @brief APR Miscellaneous library routines
 */

#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"

#if APR_HAVE_SIGNAL_H
#include <signal.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_general Miscellaneous library routines
 * @ingroup APR 
 * This is collection of oddballs that didn't fit anywhere else,
 * and might move to more appropriate headers with the release
 * of APR 1.0.
 * @{
 */

/** FALSE */
#ifndef FALSE
#define FALSE 0
#endif
/** TRUE */
#ifndef TRUE
#define TRUE (!FALSE)
#endif

/** a space */
#define APR_ASCII_BLANK  '\040'
/** a carrige return */
#define APR_ASCII_CR     '\015'
/** a line feed */
#define APR_ASCII_LF     '\012'
/** a tab */
#define APR_ASCII_TAB    '\011'

/** signal numbers typedef */
typedef int               apr_signum_t;

/**
 * Finding offsets of elements within structures.
 * Taken from the X code... they've sweated portability of this stuff
 * so we don't have to.  Sigh...
 * @param p_type pointer type name
 * @param field  data field within the structure pointed to
 * @return offset
 */

#if defined(CRAY) || (defined(__arm) && !(defined(LINUX) || defined(__FreeBSD__)))
#ifdef __STDC__
#define APR_OFFSET(p_type,field) _Offsetof(p_type,field)
#else
#ifdef CRAY2
#define APR_OFFSET(p_type,field) \
        (sizeof(int)*((unsigned int)&(((p_type)NULL)->field)))

#else /* !CRAY2 */

#define APR_OFFSET(p_type,field) ((unsigned int)&(((p_type)NULL)->field))

#endif /* !CRAY2 */
#endif /* __STDC__ */
#else /* ! (CRAY || __arm) */

#define APR_OFFSET(p_type,field) \
        ((long) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))

#endif /* !CRAY */

/**
 * Finding offsets of elements within structures.
 * @param s_type structure type name
 * @param field  data field within the structure
 * @return offset
 */
#if defined(__has_builtin)
#if __has_builtin(__builtin_offsetof)
#define APR_OFFSETOF(s_type,field) __builtin_offsetof(s_type,field)
#endif
#endif /* __has_builtin */
#ifndef APR_OFFSETOF
#if defined(offsetof) && !defined(__cplusplus)
#define APR_OFFSETOF(s_type,field) offsetof(s_type,field)
#else
#define APR_OFFSETOF(s_type,field) APR_OFFSET(s_type*,field)
#endif
#endif /* ndef APR_OFFSETOF */

#ifndef DOXYGEN

/* A couple of prototypes for functions in case some platform doesn't 
 * have it
 */
#if (!APR_HAVE_STRCASECMP) && (APR_HAVE_STRICMP) 
#define strcasecmp(s1, s2) stricmp(s1, s2)
#elif (!APR_HAVE_STRCASECMP)
int strcasecmp(const char *a, const char *b);
#endif

#if (!APR_HAVE_STRNCASECMP) && (APR_HAVE_STRNICMP)
#define strncasecmp(s1, s2, n) strnicmp(s1, s2, n)
#elif (!APR_HAVE_STRNCASECMP)
int strncasecmp(const char *a, const char *b, size_t n);
#endif

#endif

/**
 * Alignment macros
 */

/* APR_ALIGN() is only to be used to align on a power of 2 boundary */
#define APR_ALIGN(size, boundary) \
    (((size) + ((boundary) - 1)) & ~((boundary) - 1))

/** Default alignment */
#define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8)


/**
 * String and memory functions
 */

/* APR_STRINGIFY is defined here, and also in apr_release.h, so wrap it */
#ifndef APR_STRINGIFY
/** Properly quote a value as a string in the C preprocessor */
#define APR_STRINGIFY(n) APR_STRINGIFY_HELPER(n)
/** Helper macro for APR_STRINGIFY */
#define APR_STRINGIFY_HELPER(n) #n
#endif

#if (!APR_HAVE_MEMMOVE)
#define memmove(a,b,c) bcopy(b,a,c)
#endif

#if (!APR_HAVE_MEMCHR)
void *memchr(const void *s, int c, size_t n);
#endif

/** @} */

/**
 * @defgroup apr_library Library initialization and termination
 * @{
 */

/**
 * Setup any APR internal data structures.  This MUST be the first function 
 * called for any APR library. It is safe to call apr_initialize several
 * times as long as apr_terminate() is called the same number of times.
 * @remark See apr_app_initialize() if this is an application, rather than
 * a library consumer of apr.
 */
APR_DECLARE(apr_status_t) apr_initialize(void);

/**
 * Set up an application with normalized argc, argv (and optionally env) in
 * order to deal with platform-specific oddities, such as Win32 services,
 * code pages and signals.  This must be the first function called for any
 * APR program.
 * @param argc Pointer to the argc that may be corrected
 * @param argv Pointer to the argv that may be corrected
 * @param env Pointer to the env that may be corrected, may be NULL
 * @remark See apr_initialize() if this is a library consumer of apr.
 * Otherwise, this call is identical to apr_initialize(), and must be closed
 * with a call to apr_terminate() at the end of program execution.
 */
APR_DECLARE(apr_status_t) apr_app_initialize(int *argc, 
                                             char const * const * *argv, 
                                             char const * const * *env);

/**
 * Tear down any APR internal data structures which aren't torn down 
 * automatically. apr_terminate must be called once for every call to
 * apr_initialize() or apr_app_initialize().
 * @remark An APR program must call this function at termination once it 
 *         has stopped using APR services.  The APR developers suggest using
 *         @c atexit(apr_terminate) to ensure this is called.  When using APR
 *         from a language other than C that has problems with the calling
 *         convention, use apr_terminate2() instead.
 * @see apr_terminate2
 */
APR_DECLARE_NONSTD(void) apr_terminate(void);

/**
 * Tear down any APR internal data structures which aren't torn down 
 * automatically, same as apr_terminate()
 * @remark An APR program must call either the apr_terminate() or apr_terminate2
 *         function once it it has finished using APR services.  The APR 
 *         developers suggest using @c atexit(apr_terminate) to ensure this is done.
 *         apr_terminate2 exists to allow non-c language apps to tear down apr, 
 *         while apr_terminate() is recommended from c language applications.
 */
APR_DECLARE(void) apr_terminate2(void);

/** @} */

/**
 * @defgroup apr_random Random Functions
 * @{
 */

#if APR_HAS_RANDOM || defined(DOXYGEN)

/* TODO: I'm not sure this is the best place to put this prototype...*/
/**
 * Generate random bytes.
 * @param buf Buffer to fill with random bytes
 * @param length Length of buffer in bytes
 */
APR_DECLARE(apr_status_t) apr_generate_random_bytes(unsigned char * buf, 
                                                    apr_size_t length);

#endif
/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_GENERAL_H */
include/apr-1/apr_env.h000064400000004071150336140420010712 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APR_ENV_H
#define APR_ENV_H
/**
 * @file apr_env.h
 * @brief APR Environment functions
 */
#include "apr_errno.h"
#include "apr_pools.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup apr_env Functions for manipulating the environment
 * @ingroup APR 
 * @{
 */

/**
 * Get the value of an environment variable
 * @param value the returned value, allocated from @a pool
 * @param envvar the name of the environment variable
 * @param pool where to allocate @a value and any temporary storage from
 */
APR_DECLARE(apr_status_t) apr_env_get(char **value, const char *envvar,
                                      apr_pool_t *pool);

/**
 * Set the value of an environment variable
 * @param envvar the name of the environment variable
 * @param value the value to set
 * @param pool where to allocate temporary storage from
 */
APR_DECLARE(apr_status_t) apr_env_set(const char *envvar, const char *value,
                                      apr_pool_t *pool);

/**
 * Delete a variable from the environment
 * @param envvar the name of the environment variable
 * @param pool where to allocate temporary storage from
 */
APR_DECLARE(apr_status_t) apr_env_delete(const char *envvar, apr_pool_t *pool);

/** @} */

#ifdef __cplusplus
}
#endif

#endif  /* ! APR_ENV_H */
include/apr-1/apr-x86_64.h000064400000043643150336140420011006 0ustar00/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#ifndef APR_H
#define APR_H

/* GENERATED FILE WARNING!  DO NOT EDIT apr.h
 *
 * You must modify apr.h.in instead.
 *
 * And please, make an effort to stub apr.hw and apr.hnw in the process.
 */

/**
 * @file apr.h
 * @brief APR Platform Definitions
 * @remark This is a generated header generated from include/apr.h.in by
 * ./configure, or copied from include/apr.hw or include/apr.hnw 
 * for Win32 or Netware by those build environments, respectively.
 */

/**
 * @defgroup APR Apache Portability Runtime library
 * @{
 */
/**
 * @defgroup apr_platform Platform Definitions
 * @{
 * @warning
 * <strong><em>The actual values of macros and typedefs on this page<br>
 * are platform specific and should NOT be relied upon!</em></strong>
 */

/* So that we can use inline on some critical functions, and use
 * GNUC attributes (such as to get -Wall warnings for printf-like
 * functions).  Both __inline__ and __attribute__ exist for gcc >= 2.7,
 * other !__GNUC__ compilers may provide __attribute__ still.
 *
 * We've since discovered that the gcc shipped with NeXT systems
 * as "cc" is completely broken.  It claims to be __GNUC__ and so
 * on, but it doesn't implement half of the things that __GNUC__
 * means.  In particular it's missing inline and the __attribute__
 * stuff.  So we hack around it.  PR#1613. -djg
 */
#if defined(__GNUC__) \
    && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) \
    && !defined(NEXT)
#define APR_INLINE  __inline__
#define APR_HAS_INLINE          1
#else  /* !__GNUC__ */
#define APR_INLINE
#define APR_HAS_INLINE          0
/* __has_attribute should always be a pre-defined macro, but not
 * necessarily __attribute__ (e.g. builtin), so check for both to
 * avoid overriding __attribute__.
 */
#if !(defined(__attribute__) || defined(__has_attribute)) || defined(__SUNPRO_C)
#define __attribute__(__x)
#endif
#endif /* !__GNUC__ */

#define APR_HAVE_ARPA_INET_H     1
#define APR_HAVE_CONIO_H         0
#define APR_HAVE_CRYPT_H         1
#define APR_HAVE_CTYPE_H         1
#define APR_HAVE_DIRENT_H        1
#define APR_HAVE_ERRNO_H         1
#define APR_HAVE_FCNTL_H         1
#define APR_HAVE_IO_H            0
#define APR_HAVE_LIMITS_H        1
#define APR_HAVE_NETDB_H         1
#define APR_HAVE_NETINET_IN_H    1
#define APR_HAVE_NETINET_SCTP_H  1
#define APR_HAVE_NETINET_SCTP_UIO_H 0
#define APR_HAVE_NETINET_TCP_H   1
#define APR_HAVE_PROCESS_H       0
#define APR_HAVE_PTHREAD_H       1
#define APR_HAVE_SEMAPHORE_H     1
#define APR_HAVE_SIGNAL_H        1
#define APR_HAVE_STDARG_H        1
#define APR_HAVE_STDDEF_H        1
#define APR_HAVE_STDINT_H        1
#define APR_HAVE_STDIO_H         1
#define APR_HAVE_STDLIB_H        1
#define APR_HAVE_STRING_H        1
#define APR_HAVE_STRINGS_H       1
#define APR_HAVE_INTTYPES_H      1
#define APR_HAVE_SYS_IOCTL_H     1
#define APR_HAVE_SYS_SENDFILE_H  1
#define APR_HAVE_SYS_SIGNAL_H    1
#define APR_HAVE_SYS_SOCKET_H    1
#define APR_HAVE_SYS_SOCKIO_H    0
#define APR_HAVE_SYS_SYSLIMITS_H 0
#define APR_HAVE_SYS_TIME_H      1
#define APR_HAVE_SYS_TYPES_H     1
#define APR_HAVE_SYS_UIO_H       1
#define APR_HAVE_SYS_UN_H        1
#define APR_HAVE_SYS_WAIT_H      1
#define APR_HAVE_TIME_H          1
#define APR_HAVE_UNISTD_H        1
#define APR_HAVE_WINDOWS_H       0
#define APR_HAVE_WINSOCK2_H      0

/** @} */
/** @} */

/* We don't include our conditional headers within the doxyblocks 
 * or the extern "C" namespace 
 */

#if APR_HAVE_WINDOWS_H && defined(WIN32)
/* If windows.h was already included, our preferences don't matter.
 * If not, include a restricted set of windows headers to our tastes.
 */
#ifndef _WINDOWS_

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#ifndef _WIN32_WINNT
/* Restrict the server to a subset of Windows XP header files by default
 */
#define _WIN32_WINNT 0x0501
#endif

#ifndef NOUSER
#define NOUSER
#endif
#ifndef NOMCX
#define NOMCX
#endif
#ifndef NOIME
#define NOIME
#endif

#include <windows.h>
/* 
 * Add a _very_few_ declarations missing from the restricted set of headers
 * (If this list becomes extensive, re-enable the required headers above!)
 * winsock headers were excluded by WIN32_LEAN_AND_MEAN, so include them now
 */
#define SW_HIDE             0
#ifndef _WIN32_WCE
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mswsock.h>
#else
#include <winsock.h>
#endif

#endif /* ndef _WINDOWS_ */
#endif /* APR_HAVE_WINDOWS_H */

#if APR_HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif

#if APR_HAVE_STDDEF_H
#include <stddef.h>
#endif

#if APR_HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

#if APR_HAVE_STDINT_H
#ifdef __cplusplus
/* C99 7.18.4 requires that stdint.h only exposes INT64_C 
 * and UINT64_C for C++ implementations if this is defined: */
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
/* C++ needs this too for PRI*NN formats: */
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#endif /* __cplusplus */
#include <stdint.h>
#endif

#if APR_HAVE_INTTYPES_H
#include <inttypes.h>
#endif

#if APR_HAVE_SYS_WAIT_H
#include <sys/wait.h>
#endif

#ifdef OS2
#define INCL_DOS
#define INCL_DOSERRORS
#include <os2.h>
#endif

/* header files for PATH_MAX, _POSIX_PATH_MAX */
#if APR_HAVE_LIMITS_H
#include <limits.h>
#else
#if APR_HAVE_SYS_SYSLIMITS_H
#include <sys/syslimits.h>
#endif
#endif

/* __APPLE__ is now the official pre-defined macro for macOS */
#ifdef __APPLE__
#undef DARWIN
#undef DARWIN_10
#define DARWIN
#define DARWIN_10
#endif /* __APPLE__ */

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @addtogroup apr_platform
 * @ingroup APR 
 * @{
 */

#define APR_HAVE_SHMEM_MMAP_TMP     1
#define APR_HAVE_SHMEM_MMAP_SHM     0
#define APR_HAVE_SHMEM_MMAP_ZERO    1
#define APR_HAVE_SHMEM_SHMGET_ANON  1
#define APR_HAVE_SHMEM_SHMGET       1
#define APR_HAVE_SHMEM_MMAP_ANON    1
#define APR_HAVE_SHMEM_BEOS         0

#define APR_USE_SHMEM_MMAP_TMP     1
#define APR_USE_SHMEM_MMAP_SHM     0
#define APR_USE_SHMEM_MMAP_ZERO    0
#define APR_USE_SHMEM_SHMGET_ANON  0
#define APR_USE_SHMEM_SHMGET       0
#define APR_USE_SHMEM_MMAP_ANON    1
#define APR_USE_SHMEM_BEOS         0

#define APR_USE_FLOCK_SERIALIZE           0 
#define APR_USE_SYSVSEM_SERIALIZE         1
#define APR_USE_POSIXSEM_SERIALIZE        0
#define APR_USE_FCNTL_SERIALIZE           0
#define APR_USE_PROC_PTHREAD_SERIALIZE    0 
#define APR_USE_PTHREAD_SERIALIZE         1 

#define APR_HAS_FLOCK_SERIALIZE           1
#define APR_HAS_SYSVSEM_SERIALIZE         1
#define APR_HAS_POSIXSEM_SERIALIZE        1
#define APR_HAS_FCNTL_SERIALIZE           1
#define APR_HAS_PROC_PTHREAD_SERIALIZE    1

#define APR_PROCESS_LOCK_IS_GLOBAL        0

#define APR_HAVE_CORKABLE_TCP   1 
#define APR_HAVE_GETRLIMIT      1
#define APR_HAVE_IN_ADDR        1
#define APR_HAVE_INET_ADDR      1
#define APR_HAVE_INET_NETWORK   1
#define APR_HAVE_IPV6           1
#define APR_HAVE_SOCKADDR_UN    1
#define APR_HAVE_MEMMOVE        1
#define APR_HAVE_SETRLIMIT      1
#define APR_HAVE_SIGACTION      1
#define APR_HAVE_SIGSUSPEND     1
#define APR_HAVE_SIGWAIT        1
#define APR_HAVE_SA_STORAGE     1
#define APR_HAVE_STRCASECMP     1
#define APR_HAVE_STRDUP         1
#define APR_HAVE_STRICMP        0
#define APR_HAVE_STRNCASECMP    1
#define APR_HAVE_STRNICMP       0
#define APR_HAVE_STRSTR         1
#define APR_HAVE_MEMCHR         1
#define APR_HAVE_STRUCT_RLIMIT  1
#define APR_HAVE_UNION_SEMUN    0
#define APR_HAVE_SCTP           0
#define APR_HAVE_IOVEC          1

/*  APR Feature Macros */
#define APR_HAS_SHARED_MEMORY     1
#define APR_HAS_THREADS           1
#define APR_HAS_SENDFILE          1
#define APR_HAS_MMAP              1
#define APR_HAS_FORK              1
#define APR_HAS_RANDOM            1
#define APR_HAS_OTHER_CHILD       1
#define APR_HAS_DSO               1
#define APR_HAS_SO_ACCEPTFILTER   0
#define APR_HAS_UNICODE_FS        0
#define APR_HAS_PROC_INVOKED      0
#define APR_HAS_USER              1
#define APR_HAS_LARGE_FILES       0
#define APR_HAS_XTHREAD_FILES     0
#define APR_HAS_OS_UUID           1
#define APR_HAS_TIMEDLOCKS        1

#define APR_PROCATTR_USER_SET_REQUIRES_PASSWORD 0

/* APR sets APR_FILES_AS_SOCKETS to 1 on systems where it is possible
 * to poll on files/pipes.
 */
#define APR_FILES_AS_SOCKETS      1

/* This macro indicates whether or not EBCDIC is the native character set.
 */
#define APR_CHARSET_EBCDIC        0

/* If we have a TCP implementation that can be "corked", what flag
 * do we use?
 */
#define APR_TCP_NOPUSH_FLAG       TCP_CORK

/* Is the TCP_NODELAY socket option inherited from listening sockets?
*/
#define APR_TCP_NODELAY_INHERITED 1

/* Is the O_NONBLOCK flag inherited from listening sockets?
*/
#define APR_O_NONBLOCK_INHERITED 0

/* Typedefs that APR needs. */

typedef  unsigned char           apr_byte_t;

typedef  short           apr_int16_t;
typedef  unsigned short  apr_uint16_t;

typedef  int             apr_int32_t;
typedef  unsigned int    apr_uint32_t;

#define APR_SIZEOF_VOIDP 8

/*
 * Darwin 10's default compiler (gcc42) builds for both 64 and
 * 32 bit architectures unless specifically told not to.
 * In those cases, we need to override types depending on how
 * we're being built at compile time.
 * NOTE: This is an ugly work-around for Darwin's
 * concept of universal binaries, a single package
 * (executable, lib, etc...) which contains both 32
 * and 64 bit versions. The issue is that if APR is
 * built universally, if something else is compiled
 * against it, some bit sizes will depend on whether
 * it is 32 or 64 bit. This is determined by the __LP64__
 * flag. Since we need to support both, we have to
 * handle OS X unqiuely.
 */
#ifdef DARWIN_10
#undef APR_SIZEOF_VOIDP
#undef APR_INT64_C
#undef APR_UINT64_C
#ifdef __LP64__
 typedef  long            apr_int64_t;
 typedef  unsigned long   apr_uint64_t;
 #define APR_SIZEOF_VOIDP     8
 #define APR_INT64_C(v)   (v ## L)
 #define APR_UINT64_C(v)  (v ## UL)
#else
 typedef  long long            apr_int64_t;
 typedef  unsigned long long   apr_uint64_t;
 #define APR_SIZEOF_VOIDP     4
 #define APR_INT64_C(v)   (v ## LL)
 #define APR_UINT64_C(v)  (v ## ULL)
#endif
#else
 typedef  int64_t           apr_int64_t;
 typedef  uint64_t          apr_uint64_t;

 /* Mechanisms to properly type numeric literals */
 #define APR_INT64_C(val) INT64_C(val)
 #define APR_UINT64_C(val) UINT64_C(val)
#endif

typedef  size_t          apr_size_t;
typedef  ssize_t         apr_ssize_t;
typedef  off_t           apr_off_t;
typedef  socklen_t       apr_socklen_t;
typedef  ino_t           apr_ino_t;

#if APR_SIZEOF_VOIDP == 8
typedef  apr_uint64_t            apr_uintptr_t;
#else
typedef  apr_uint32_t            apr_uintptr_t;
#endif

/* Are we big endian? */
#define APR_IS_BIGENDIAN	0

#ifdef INT16_MIN
#define APR_INT16_MIN   INT16_MIN
#else
#define APR_INT16_MIN   (-0x7fff - 1)
#endif

#ifdef INT16_MAX
#define APR_INT16_MAX  INT16_MAX
#else
#define APR_INT16_MAX   (0x7fff)
#endif

#ifdef UINT16_MAX
#define APR_UINT16_MAX  UINT16_MAX
#else
#define APR_UINT16_MAX  (0xffff)
#endif

#ifdef INT32_MIN
#define APR_INT32_MIN   INT32_MIN
#else
#define APR_INT32_MIN   (-0x7fffffff - 1)
#endif

#ifdef INT32_MAX
#define APR_INT32_MAX  INT32_MAX
#else
#define APR_INT32_MAX  0x7fffffff
#endif

#ifdef UINT32_MAX
#define APR_UINT32_MAX  UINT32_MAX
#else
#define APR_UINT32_MAX  (0xffffffffU)
#endif

#ifdef INT64_MIN
#define APR_INT64_MIN   INT64_MIN
#else
#define APR_INT64_MIN   (APR_INT64_C(-0x7fffffffffffffff) - 1)
#endif

#ifdef INT64_MAX
#define APR_INT64_MAX   INT64_MAX
#else
#define APR_INT64_MAX   APR_INT64_C(0x7fffffffffffffff)
#endif

#ifdef UINT64_MAX
#define APR_UINT64_MAX  UINT64_MAX
#else
#define APR_UINT64_MAX  APR_UINT64_C(0xffffffffffffffff)
#endif

#define APR_SIZE_MAX    (~((apr_size_t)0))


/* Definitions that APR programs need to work properly. */

/**
 * APR public API wrap for C++ compilers.
 */
#ifdef __cplusplus
#define APR_BEGIN_DECLS     extern "C" {
#define APR_END_DECLS       }
#else
#define APR_BEGIN_DECLS
#define APR_END_DECLS
#endif

/** 
 * Thread callbacks from APR functions must be declared with APR_THREAD_FUNC, 
 * so that they follow the platform's calling convention.
 * <PRE>
 *
 * void* APR_THREAD_FUNC my_thread_entry_fn(apr_thread_t *thd, void *data);
 *
 * </PRE>
 */
#define APR_THREAD_FUNC       

#if defined(DOXYGEN) || !defined(WIN32)

/**
 * The public APR functions are declared with APR_DECLARE(), so they may
 * use the most appropriate calling convention.  Public APR functions with 
 * variable arguments must use APR_DECLARE_NONSTD().
 *
 * @remark Both the declaration and implementations must use the same macro.
 *
 * <PRE>
 * APR_DECLARE(rettype) apr_func(args)
 * </PRE>
 * @see APR_DECLARE_NONSTD @see APR_DECLARE_DATA
 * @remark Note that when APR compiles the library itself, it passes the 
 * symbol -DAPR_DECLARE_EXPORT to the compiler on some platforms (e.g. Win32) 
 * to export public symbols from the dynamic library build.\n
 * The user must define the APR_DECLARE_STATIC when compiling to target
 * the static APR library on some platforms (e.g. Win32.)  The public symbols 
 * are neither exported nor imported when APR_DECLARE_STATIC is defined.\n
 * By default, compiling an application and including the APR public
 * headers, without defining APR_DECLARE_STATIC, will prepare the code to be
 * linked to the dynamic library.
 */
#define APR_DECLARE(type)            type 

/**
 * The public APR functions using variable arguments are declared with 
 * APR_DECLARE_NONSTD(), as they must follow the C language calling convention.
 * @see APR_DECLARE @see APR_DECLARE_DATA
 * @remark Both the declaration and implementations must use the same macro.
 * <PRE>
 *
 * APR_DECLARE_NONSTD(rettype) apr_func(args, ...);
 *
 * </PRE>
 */
#define APR_DECLARE_NONSTD(type)     type

/**
 * The public APR variables are declared with AP_MODULE_DECLARE_DATA.
 * This assures the appropriate indirection is invoked at compile time.
 * @see APR_DECLARE @see APR_DECLARE_NONSTD
 * @remark Note that the declaration and implementations use different forms,
 * but both must include the macro.
 * 
 * <PRE>
 *
 * extern APR_DECLARE_DATA type apr_variable;\n
 * APR_DECLARE_DATA type apr_variable = value;
 *
 * </PRE>
 */
#define APR_DECLARE_DATA

#elif defined(APR_DECLARE_STATIC)
#define APR_DECLARE(type)            type __stdcall
#define APR_DECLARE_NONSTD(type)     type __cdecl
#define APR_DECLARE_DATA
#elif defined(APR_DECLARE_EXPORT)
#define APR_DECLARE(type)            __declspec(dllexport) type __stdcall
#define APR_DECLARE_NONSTD(type)     __declspec(dllexport) type __cdecl
#define APR_DECLARE_DATA             __declspec(dllexport)
#else
#define APR_DECLARE(type)            __declspec(dllimport) type __stdcall
#define APR_DECLARE_NONSTD(type)     __declspec(dllimport) type __cdecl
#define APR_DECLARE_DATA             __declspec(dllimport)
#endif

/* Define APR_SSIZE_T_FMT.  
 * If ssize_t is an integer we define it to be "d",
 * if ssize_t is a long int we define it to be "ld",
 * if ssize_t is neither we declare an error here.
 * I looked for a better way to define this here, but couldn't find one, so
 * to find the logic for this definition search for "ssize_t_fmt" in
 * configure.in.
 */

#define APR_SSIZE_T_FMT "ld"

/* And APR_SIZE_T_FMT */
#define APR_SIZE_T_FMT "lu"

/* And APR_OFF_T_FMT */
#define APR_OFF_T_FMT "ld"

/* And APR_PID_T_FMT */
#define APR_PID_T_FMT "d"

/* And APR_INT64_T_FMT */
#define APR_INT64_T_FMT PRId64

/* And APR_UINT64_T_FMT */
#define APR_UINT64_T_FMT PRIu64

/* And APR_UINT64_T_HEX_FMT */
#define APR_UINT64_T_HEX_FMT PRIx64

/*
 * Ensure we work with universal binaries on Darwin
 */
#ifdef DARWIN_10

#undef APR_HAS_LARGE_FILES
#undef APR_SIZEOF_VOIDP
#undef APR_INT64_T_FMT
#undef APR_UINT64_T_FMT
#undef APR_UINT64_T_HEX_FMT

#ifdef __LP64__
 #define APR_HAS_LARGE_FILES  0
 #define APR_SIZEOF_VOIDP     8
 #define APR_INT64_T_FMT      "ld"
 #define APR_UINT64_T_FMT     "lu"
 #define APR_UINT64_T_HEX_FMT "lx"
#else
 #define APR_HAS_LARGE_FILES  1
 #define APR_SIZEOF_VOIDP     4
 #define APR_INT64_T_FMT      "lld"
 #define APR_UINT64_T_FMT     "llu"
 #define APR_UINT64_T_HEX_FMT "llx"
#endif

#undef APR_IS_BIGENDIAN
#ifdef __BIG_ENDIAN__
 #define APR_IS_BIGENDIAN	1
#else
 #define APR_IS_BIGENDIAN	0
#endif

#undef APR_OFF_T_FMT
#define APR_OFF_T_FMT "lld"

#endif /* DARWIN_10 */

/* Does the proc mutex lock threads too */
#define APR_PROC_MUTEX_IS_GLOBAL      0

/* Local machine definition for console and log output. */
#define APR_EOL_STR              "\n"

#if APR_HAVE_SYS_WAIT_H
#ifdef WEXITSTATUS
#define apr_wait_t       int
#else
#define apr_wait_t       union wait
#define WEXITSTATUS(status)    (int)((status).w_retcode)
#define WTERMSIG(status)       (int)((status).w_termsig)
#endif /* !WEXITSTATUS */
#elif defined(__MINGW32__)
typedef int apr_wait_t;
#endif /* HAVE_SYS_WAIT_H */

#if defined(PATH_MAX)
#define APR_PATH_MAX       PATH_MAX
#elif defined(_POSIX_PATH_MAX)
#define APR_PATH_MAX       _POSIX_PATH_MAX
#else
#error no decision has been made on APR_PATH_MAX for your platform
#endif

#define APR_DSOPATH "LD_LIBRARY_PATH"

/** @} */

/* Definitions that only Win32 programs need to compile properly. */

/* XXX These simply don't belong here, perhaps in apr_portable.h
 * based on some APR_HAVE_PID/GID/UID?
 */
#ifdef __MINGW32__
#ifndef __GNUC__
typedef  int         pid_t;
#endif
typedef  int         uid_t;
typedef  int         gid_t;
#endif

#ifdef __cplusplus
}
#endif

#endif /* APR_H */
bin/apu-1-config000075500000014122150336140420007426 0ustar00#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# APR-util script designed to allow easy command line access to APR-util
# configuration parameters.

APRUTIL_MAJOR_VERSION="1"
APRUTIL_DOTTED_VERSION="1.6.3"

prefix="/opt/cpanel/ea-apr16"
exec_prefix="${prefix}"
bindir="${exec_prefix}/bin"
includedir="/opt/cpanel/ea-apr16/include/apr-1"

libdir=`pkg-config --variable=libdir ea-apr16-util-1`

LIBS="-lexpat -ldb-5.3  "
INCLUDES=""
LDFLAGS=""
LDAP_LIBS="-lldap_r  -llber"
DBM_LIBS="-ldb-5.3  "

APRUTIL_LIBNAME="aprutil-${APRUTIL_MAJOR_VERSION}"

APU_SOURCE_DIR="/builddir/build/BUILD/apr-util-1.6.3"
APU_BUILD_DIR="/builddir/build/BUILD/apr-util-1.6.3"
APR_XML_EXPAT_OLD="@APR_XML_EXPAT_OLD@"
APU_DB_VERSION="5"

# NOTE: the following line is modified during 'make install': alter with care!
location=installed

show_usage()
{
    cat << EOF
Usage: apu-$APRUTIL_MAJOR_VERSION-config [OPTION]

Known values for OPTION are:
  --prefix[=DIR]    change prefix to DIR
  --bindir          print location where binaries are installed
  --includes        print include information
  --includedir      print location where headers are installed
  --ldflags         print linker flags
  --libs            print library information
  --avoid-ldap      do not include ldap library information with --libs
  --ldap-libs       print library information to link with ldap
  --avoid-dbm       do not include DBM library information with --libs
  --dbm-libs        print additional library information to link with DBM
  --srcdir          print APR-util source directory
  --link-ld         print link switch(es) for linking to APR-util
  --link-libtool    print the libtool inputs for linking to APR-util
  --apu-la-file     print the path to the .la file, if available
  --old-expat       indicate if APR-util was built against an old expat
  --db-version      print the DB version
  --version         print APR-util's version as a dotted triple
  --help            print this help

When linking with libtool, an application should do something like:
  APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-libtool --libs\`"
or when linking directly:
  APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-ld --libs\`"

An application should use the results of --includes, and --ldflags in
their build process.
EOF
}

if test $# -eq 0; then
    show_usage
    exit 1
fi

if test "$location" = "installed"; then
    LA_FILE="$libdir/lib${APRUTIL_LIBNAME}.la"
else
    LA_FILE="$APU_BUILD_DIR/lib${APRUTIL_LIBNAME}.la"
fi

flags=""

while test $# -gt 0; do
    # Normalize the prefix.
    case "$1" in
    -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
    *) optarg= ;;
    esac

    case "$1" in
    # It is possible for the user to override our prefix.
    --prefix=*)
    prefix=$optarg
    ;;
    --prefix)
    echo $prefix
    exit 0
    ;;
    --bindir)
    echo $bindir
    exit 0
    ;;
    --avoid-ldap)
    LDAP_LIBS=""
    ;;
    --avoid-dbm)
    DBM_LIBS=""
    ;;
    --libs)
    flags="$flags $LDAP_LIBS $DBM_LIBS $LIBS"
    ;;
    --ldap-libs)
    flags="$flags $LDAP_LIBS"
    ;;
    --dbm-libs)
    flags="$flags $DBM_LIBS"
    ;;
    --includedir)
    if test "$location" = "installed"; then
        flags="$includedir"
    elif test "$location" = "source"; then
        flags="$APU_SOURCE_DIR/include"
    else
        # this is for VPATH builds
        flags="$APU_BUILD_DIR/include $APU_SOURCE_DIR/include"
    fi
    echo $flags
    exit 0
    ;;
    --includes)
    if test "$location" = "installed"; then
        flags="$flags -I$includedir $INCLUDES"
    elif test "$location" = "source"; then
        flags="$flags -I$APU_SOURCE_DIR/include $INCLUDES"
    else
        # this is for VPATH builds
        flags="$flags -I$APU_BUILD_DIR/include -I$APU_SOURCE_DIR/include $INCLUDES"
    fi
    ;;
    --ldflags)
    flags="$flags $LDFLAGS"
    ;;
    --srcdir)
    echo $APU_SOURCE_DIR
    exit 0
    ;;
    --version)
    echo $APRUTIL_DOTTED_VERSION
    exit 0
    ;;
    --link-ld)
    if test "$location" = "installed"; then
        ### avoid using -L if libdir is a "standard" location like /usr/lib
        flags="$flags -L$libdir -l$APRUTIL_LIBNAME"
    else
        flags="$flags -L$APU_BUILD_DIR -l$APRUTIL_LIBNAME"
    fi
    ;;
    --link-libtool)
    # If the LA_FILE exists where we think it should be, use it.  If we're
    # installed and the LA_FILE does not exist, assume to use -L/-l
    # (the LA_FILE may not have been installed).  If we're building ourselves,
    # we'll assume that at some point the .la file be created.
    if test -f "$LA_FILE"; then
        flags="$flags $LA_FILE"
    elif test "$location" = "installed"; then
        ### avoid using -L if libdir is a "standard" location like /usr/lib
        # Since the user is specifying they are linking with libtool, we
        # *know* that -R will be recognized by libtool.
        flags="$flags -L$libdir -R$libdir -l$APRUTIL_LIBNAME"
    else
        flags="$flags $LA_FILE"
    fi
    ;;
    --apu-la-file)
    if test -f "$LA_FILE"; then
        flags="$flags $LA_FILE"
    fi
    ;;
    --old-expat)
    if test ! -n "$APR_XML_EXPAT_OLD"; then
        echo "no"
    else
        echo "$APR_XML_EXPAT_OLD"
    fi
    exit 0
    ;;
    --db-version)
    echo $APU_DB_VERSION
    exit 0
    ;;
    --help)
    show_usage
    exit 0
    ;;
    *)
    show_usage
    exit 1
    ;;
    esac

    # Next please.
    shift
done

if test -n "$flags"; then
  echo "$flags"
fi

exit 0
bin/apr-1-config000075500000020637150336140420007433 0ustar00#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# APR script designed to allow easy command line access to APR configuration
# parameters.

APR_MAJOR_VERSION="1"
APR_DOTTED_VERSION="1.7.6"

prefix="/opt/cpanel/ea-apr16"
exec_prefix="${prefix}"
bindir="${exec_prefix}/bin"
datarootdir="${prefix}"
datadir="${prefix}"
includedir="${prefix}/include/apr-${APR_MAJOR_VERSION}"

libdir=`pkg-config --variable=libdir ea-apr16-1`
installbuilddir="${libdir}/apr-1/build"

CC="gcc"
CPP="gcc -E"
SHELL="/bin/sh"
CPPFLAGS=`pkg-config --variable=CPPFLAGS ea-apr16-1`
CFLAGS="-g -O2 -pthread"
LDFLAGS=""
LIBS=" -lpthread -ldl"
EXTRA_INCLUDES=""
SHLIBPATH_VAR="LD_LIBRARY_PATH"
APR_SOURCE_DIR="${libdir}/build"
APR_BUILD_DIR="${libdir}/build"
APR_SO_EXT="lo"
APR_LIB_TARGET="-rpath \$(libdir) \$(OBJECTS)"
APR_LIBNAME="apr-${APR_MAJOR_VERSION}"

# NOTE: the following line is modified during 'make install': alter with care!
location=installed

cross_compiling=no

if test "$cross_compiling" != "no"; then

    # Normalize $0 and bindir by removing consecutive '/' as the comparison
    # and the suffix removal below might fail for semantic equal pathes.
    # XXX: This is not perfect. On Linux we could use realpath for this purpose
    # but realpath is not portable.
    normalized_command=`echo $0 | tr -s /`
    normalized_bindir=`echo ${bindir} | tr -s /`
    # Remove trailing '/'
    normalized_bindir=${normalized_bindir%/}

    # absolute path, but not installed path - we're cross compiling
    case "$normalized_command" in
      "${normalized_bindir}/"*) ;;
      "/"*)                     location=crosscompile;
                                APR_TARGET_DIR=${normalized_command%${normalized_bindir}/apr-${APR_MAJOR_VERSION}-config};
                                ;;
      *)                        ;;
    esac
fi

show_usage()
{
    cat << EOF
Usage: apr-$APR_MAJOR_VERSION-config [OPTION]

Known values for OPTION are:
  --prefix[=DIR]    change prefix to DIR
  --bindir          print location where binaries are installed
  --includedir      print location where headers are installed
  --cc              print C compiler name
  --cpp             print C preprocessor name and any required options
  --cflags          print C compiler flags
  --cppflags        print C preprocessor flags
  --includes        print include information
  --ldflags         print linker flags
  --libs            print additional libraries to link against
  --srcdir          print APR source directory
  --installbuilddir print APR build helper directory
  --link-ld         print link switch(es) for linking to APR
  --link-libtool    print the libtool inputs for linking to APR
  --shlib-path-var  print the name of the shared library path env var
  --apr-la-file     print the path to the .la file, if available
  --apr-so-ext      print the extensions of shared objects on this platform
  --apr-lib-target  print the libtool target information
  --apr-libtool     print the path to APR's libtool
  --version         print the APR's version as a dotted triple
  --help            print this help

When linking with libtool, an application should do something like:
  APR_LIBS="\`apr-$APR_MAJOR_VERSION-config --link-libtool --libs\`"
or when linking directly:
  APR_LIBS="\`apr-$APR_MAJOR_VERSION-config --link-ld --libs\`"

An application should use the results of --cflags, --cppflags, --includes,
and --ldflags in their build process.
EOF
}

if test $# -eq 0; then
    show_usage
    exit 1
fi

if test "$location" = "installed"; then
    LA_FILE="$libdir/lib${APR_LIBNAME}.la"
elif test "$location" = "crosscompile"; then
    LA_FILE="$APR_TARGET_DIR/$libdir/lib${APR_LIBNAME}.la"
else
    LA_FILE="$APR_BUILD_DIR/lib${APR_LIBNAME}.la"
fi

flags=""

while test $# -gt 0; do
    # Normalize the prefix.
    case "$1" in
    -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
    *) optarg= ;;
    esac

    case "$1" in
    # It is possible for the user to override our prefix.
    --prefix=*)
    prefix=$optarg
    ;;
    --prefix)
    echo $prefix
    exit 0
    ;;
    --bindir)
    echo $bindir
    exit 0
    ;;
    --includedir)
    if test "$location" = "installed"; then
        flags="$includedir"
    elif test "$location" = "crosscompile"; then
        flags="$APR_TARGET_DIR/$includedir"
    elif test "$location" = "source"; then
        flags="$APR_SOURCE_DIR/include"
    else
        # this is for VPATH builds
        flags="$APR_BUILD_DIR/include $APR_SOURCE_DIR/include"
    fi
    echo $flags
    exit 0
    ;;
    --cc)
    echo $CC
    exit 0
    ;;
    --cpp)
    echo $CPP
    exit 0
    ;;
    --cflags)
    flags="$flags $CFLAGS"
    ;;
    --cppflags)
    flags="$flags $CPPFLAGS"
    ;;
    --libs)
    flags="$flags $LIBS"
    ;;
    --ldflags)
    flags="$flags $LDFLAGS"
    ;;
    --includes)
    if test "$location" = "installed"; then
        flags="$flags -I$includedir $EXTRA_INCLUDES"
    elif test "$location" = "crosscompile"; then
        flags="$flags -I$APR_TARGET_DIR/$includedir $EXTRA_INCLUDES"
    elif test "$location" = "source"; then
        flags="$flags -I$APR_SOURCE_DIR/include $EXTRA_INCLUDES"
    else
        # this is for VPATH builds
        flags="$flags -I$APR_BUILD_DIR/include -I$APR_SOURCE_DIR/include $EXTRA_INCLUDES"
    fi
    ;;
    --srcdir)
    echo $APR_SOURCE_DIR
    exit 0
    ;;
    --installbuilddir)
    if test "$location" = "installed"; then
        echo "${installbuilddir}"
    elif test "$location" = "crosscompile"; then
        echo "$APR_TARGET_DIR/${installbuilddir}"
    elif test "$location" = "source"; then
        echo "$APR_SOURCE_DIR/build"
    else
        # this is for VPATH builds
        echo "$APR_BUILD_DIR/build"
    fi
    exit 0
    ;;
    --version)
    echo $APR_DOTTED_VERSION
    exit 0
    ;;
    --link-ld)
    if test "$location" = "installed"; then
        if test "$prefix" != "/usr"; then
            flags="$flags -L$libdir"
        fi
        flags="$flags -l${APR_LIBNAME}"
    elif test "$location" = "crosscompile"; then
        flags="$flags -L$APR_TARGET_DIR/$libdir -l${APR_LIBNAME}"
    else
        ### this surely can't work since the library is in .libs?
        flags="$flags -L$APR_BUILD_DIR -l${APR_LIBNAME}"
    fi
    ;;
    --link-libtool)
    # If the LA_FILE exists where we think it should be, use it.  If we're
    # installed and the LA_FILE does not exist, assume to use -L/-l
    # (the LA_FILE may not have been installed).  If we're building ourselves,
    # we'll assume that at some point the .la file be created.
    if test -f "$LA_FILE"; then
        flags="$flags $LA_FILE"
    elif test "$location" = "installed"; then
        ### avoid using -L if libdir is a "standard" location like /usr/lib
        # Since the user is specifying they are linking with libtool, we
        # *know* that -R will be recognized by libtool.
        flags="$flags -L$libdir -R$libdir -l${APR_LIBNAME}"
    elif test "$location" = "crosscompile"; then
        flags="$flags  -L${APR_TARGET_DIR}/$libdir  -l${APR_LIBNAME}"
    else
        flags="$flags $LA_FILE"
    fi
    ;;
    --shlib-path-var)
    echo "$SHLIBPATH_VAR"
    exit 0
    ;;
    --apr-la-file)
    if test -f "$LA_FILE"; then
        flags="$flags $LA_FILE"
    fi
    ;;
    --apr-so-ext)
    echo "$APR_SO_EXT"
    exit 0
    ;;
    --apr-lib-target)
    echo "$APR_LIB_TARGET"
    exit 0
    ;;
    --apr-libtool)
    if test "$location" = "installed"; then
        echo "${installbuilddir}/libtool"
    elif test "$location" = "crosscompile"; then
        echo "$APR_TARGET_DIR/${installbuilddir}/libtool"
    else
        echo "$APR_BUILD_DIR/libtool"
    fi
    exit 0
    ;;
    --help)
    show_usage
    exit 0
    ;;
    *)
    show_usage
    exit 1
    ;;
    esac

    # Next please.
    shift
done

if test -n "$flags"; then
  echo "$flags"
fi

exit 0
lib64/libaprutil-1.so.0.6.3000075500000551400150336140420011005 0ustar00ELF>0�@�@8@�� ����"��"@� ����"��"PP���$$P�td J J J�
�
Q�tdR�td����"��"ppGNUš[SpԾ�i��f_�5E=� �8H�-�*!�J �
(T�
j����	R��-�L"`�@�@!!`��h����Pq`b��0ɩ ��;dT� 0C�@� �b��b�dZ�P@�	2"�$`V
rx@��@�hlA(Z�!!M�K��\VDl�arJ�
H(�@�@��b�B��2!���U� �2A� HPW
A`�3�@
D�@�R	���D�0���������������������������������������������	
 !"#&(*+,-/1458:;ACFIJKLMNPQRUVX[\]`abdhijlptwz|}�����������������������������������������������������������������������������-�ͳ��3K���8Vy+z?�L芩u4X0�-~��`�y�r�ȠG�{�C-��;�f�g9-�|9)&	N�@�[p�^�4BmuE���"B�=��R��-3��������\5Ӣ���!c�]���R�3�����]�}�m���WX�J}?q�.U}c�!�l�۝<	��$�C�{֧�;�:�V#Y�N#LQ�I���?���/󽐲*�5	1�R�$��fhK@y9�Q�𘢪�t%Fw�n�Ɵ'�gu�u&Țl����� B��|Y����lI����e�)��Yx��۠.��tȓPB-�����5��ТW����.�����T��.@��?�&�{�\�Vk�a�iy�W-���*�bo���&`�v"�qTPV�������(�q4{��Wق��k#h����8���-<��Aw��# �5Y��;mz�4?	���Z�O��F�Aв���uI-G<BE����5(-G<�M�6� I�I]�dz�W�!� �D"���"�o��N���+�L͜�%�X�p��D!%q4�h-ck� �qu�9fX�E�yX
��}D���Fw�o4�;�D���92��옹��u����H�p�4�!6�
���:�a����rx�:���2�<���RT�ެ5d����L����p4���F�9(?Q�BTF��rc�KO���U�-_�u`}W�QqU��2n�;���*�O,��w�R�[�������C�>�n�i~u~uh5Om�f��g���� �V�~U�OOiH�9]l\K-[�﹄p3N�2U�p?�m�R��F����IY��l��ſu�O��VN��j���Yu{�}�q'���?j
�r���I�#��8d�b�4ƌ��)�h�g�( 1�4�B+�eA��\�x]A�*�x��#�>0Qn��2��g�2�}��3��#Tj8�Ųo�k8�q'�2�G��yF�e6b���2�����Rh�1����`�
f7�X�Q䏫L�����:��$�厦A��C>8�
M~��K��ժJ��D1�85�qX+eAv�_���c����!��S�J��f�:�o��c������ӂdS�b�=!�����a#"���<G�d�t+>�D�6���#R+��{�Fw�Rk�g���z�����x5`�	����8���r�1~À�7��Я|���|���G�\E�G�ԕŠ���>-���!v[fcݾ��Jц�؊p?��z4Ful��!�d�}�.�/K��q4��T�v��t��X�\h�N1�k�����́W��:��}�1��ZE.~Z�փ���!��&��f���y�]z/Ap�^�ۆi�V���q���c�a$c��FD��� ���~��T��7GiH*b�Տ��G��!����	��&e��$v6!�� ��1$�
�%�	��#����z%W"h��J!����H�}{!�:������
D�5�(�%��|$g=�%��m$x��
�
�$V�HT �?E���	Y�}�	�5%���
��%�%H�X[ko��#�$&�	�,��V!&g�%Wf$6	�#:*.77�c, �
�v���F"!#�
i#^	��
$@n!�`�D��y��,	�
���@�u"`�%�
�I$�����3>PpY#]� ���0�T��ro]$�������OX?0���ip�b��Q�Y#���"8 �sA��"8����Vp2��+��5=�=��}�`�;0YI�"`�,U�R���a��c�"8�P�N�0�O" �����@�"8��'�`n�V`���0n+a�����ZS���5j`�D����! �NipxS
@��!��*��3x��"8�#`�a�r�$���P�-�0�|���Q%`r�8�"�p�a��"@�0_0^G�$�N� M�e�2 r�p*���4�#����0J3�@���P�*� �"a�D��P�I{�{�#	��6���"X�P5��,	I
`�
��60�O>F0Q��;-��'F�-��0,�p,.
�wo�6#��<N�I_{��� �	H�� ��PH6$�+��V�0�JNT�$0�� ���N���������.�c��P�F�&к"�	 ���F��Q
�$ 
Y�
P'd# Cv���"8��(������.��ug0�"~@�"n
���*$���.Vp��f"@�X
p�D�6Op�"�!`�Y�P7L���t����
�'��,7#��x �T�
��� �)k��"8�`sC�
��k�I2�w+d%��%�(�#�
��[Z`���
��)p6�����7�	��
��P��J*�"8�"�# ��	�@�>��}7 P��`�68@�-��KVt�^s7�-����C6  p,���`����M\}��O
��p
!6������bS
��@�
Y#��l�!@�Uж0
���s���K��k	���p����Bb `�_��}�(��{
�p��!`�����$jB��,6�6v��r���<��0�*�P�h���{�PbS� ��	0�i�<�
�%eA�+	�$�
�*
P�*�-~�Z9�!���+����4 \��.pO�`$ 	`�C� �������"��
�	���O��<��78F#���p�TT@x+����`Ij�������u�2���4�&��"8�7�"�����<
������)"`�oK�]u�G�K	��D���%���&к"���"���!0�+�0��Cx+�b3��"BpB�� 4����	70]u5��5	���0I#�P3�' �6V`�u��=} �O��XPQUD P�:p��L0�`�P,?PF'�@�"8��O,�_- \�We�(�"W�p3��\,	���������+*]
��"0���\m��Br ,0X~@��' @�`�CR�6>% 1	 �"X��"� �t(#��o`�:"��C~�6���� �pPBc@!.%p��pJG�#���п"+)����"P����V��,# �_~p�Q�C��
�0p�J���	��}#@�g��-�1`����"��zX)������P�H��7 �~�@+N��__gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizeapr_brigade_cleanupapr_brigade_destroyapr_pool_cleanup_killapr_brigade_createapr_pallocapr_pool_cleanup_nullapr_pool_cleanup_registerapr_brigade_split_exapr_brigade_splitapr_brigade_partitionapr_brigade_lengthapr_brigade_flattenmemcpyapr_brigade_pflattenapr_brigade_to_iovecapr_brigade_writeapr_bucket_type_heapapr_bucket_allocapr_bucket_freeapr_bucket_heap_createapr_bucket_transient_createapr_brigade_split_linememchrapr_brigade_putcapr_brigade_writevapr_brigade_vputstrsstrlenapr_brigade_putsapr_brigade_putstrsapr_brigade_vprintfapr_vformatterapr_brigade_printfapr_brigade_insert_fileapr_bucket_file_createapr_bucket_setaside_noopapr_bucket_setaside_notimplapr_bucket_split_notimplapr_bucket_copy_notimplapr_bucket_destroy_noopapr_allocator_freeapr_bucket_alloc_create_exapr_allocator_allocapr_bucket_alloc_createapr_pool_allocator_getapr_pool_abort_getabortapr_bucket_alloc_destroyapr_bucket_alloc_aligned_floorapr_allocator_alignapr_bucket_eos_makeapr_bucket_type_eosapr_bucket_eos_createapr_bucket_simple_copyapr_file_pool_getapr_pool_is_ancestorapr_file_dupapr_file_setasideapr_bucket_shared_destroyapr_mmap_createapr_bucket_mmap_makeapr_file_flags_getapr_file_name_getapr_file_openapr_file_seekapr_file_readapr_bucket_heap_makeapr_bucket_type_fileapr_bucket_file_makeapr_bucket_shared_makeapr_bucket_file_enable_mmapapr_bucket_file_set_buf_sizeapr_bucket_shared_splitapr_bucket_shared_copyapr_bucket_flush_makeapr_bucket_type_flushapr_bucket_flush_createapr_mmap_offsetapr_mmap_deleteapr_bucket_type_mmapapr_mmap_dupapr_bucket_mmap_createapr_bucket_pipe_makeapr_bucket_type_pipeapr_bucket_pipe_createapr_bucket_immortal_makeapr_file_pipe_timeout_getapr_file_pipe_timeout_setapr_file_closeapr_bucket_pool_makeapr_bucket_type_poolapr_bucket_pool_createapr_bucket_simple_splitapr_bucket_type_immortalapr_bucket_immortal_createapr_bucket_transient_makeapr_bucket_type_transientapr_bucket_socket_makeapr_bucket_type_socketapr_bucket_socket_createapr_socket_recvapr_socket_timeout_getapr_socket_timeout_setapr_crypto_initapr_pool_parent_getapu_dso_initapr_hash_makeapr_crypto_clearapr__memzero_explicitmemsetapr_crypto_memzeroexplicit_bzeroapr_crypto_equalsapr_crypto_get_driverapu_dso_mutex_lockapr_hash_getapu_dso_mutex_unlockapr_hash_pool_getapr_snprintfapu_dso_loadapr_dso_errorapr_pstrdupapr_hash_setapr_crypto_driver_nameapr_crypto_errorapr_crypto_makeapr_crypto_get_block_key_typesapr_crypto_get_block_key_modesapr_crypto_keyapr_crypto_passphraseapr_crypto_block_encrypt_initapr_crypto_block_encryptapr_crypto_block_encrypt_finishapr_crypto_block_decrypt_initapr_crypto_block_decryptapr_crypto_block_decrypt_finishapr_crypto_block_cleanupapr_crypto_cleanupapr_crypto_shutdownapr_md4_initapr_md4_set_xlateapr_xlate_sb_getapr_md4_updateapr_xlate_conv_bufferapr_md4_finalapr_md4apr_md5_initapr_md5_set_xlateapr_md5_updateapr_md5_finalapr_md5apr_md5_encodestrncatapr_cpystrnapr_password_validateapr_sha1_base64strcmpcrypt_r_crypt_blowfish_rn__errno_locationapr_bcrypt_encode_crypt_gensalt_blowfish_rnapr_sha1_initapr_sha1_update_binaryapr_sha1_updateapr_sha1_finalapr_base64_encode_binaryapr_siphashapr_siphash_authapr_siphash24apr_siphash24_authapr_siphash48apr_siphash48_auth_crypt_output_magicmemcmpapr_uuid_getapr_os_uuid_getapr_time_nowapr_generate_random_bytessrandapr_uuid_formatapr_uuid_parse__ctype_b_locapr_dbd_mutex_lockapr_thread_mutex_lockapr_dbd_mutex_unlockapr_thread_mutex_unlockapr_dbd_initapr_atomic_inc32apr_thread_mutex_createapr_atomic_dec32apr_atomic_set32apr_atomic_read32apr_dbd_get_driverapr_dbd_transaction_startapr_dbd_transaction_endapr_dbd_transaction_mode_getapr_dbd_transaction_mode_setapr_dbd_closeapr_dbd_nameapr_dbd_native_handleapr_dbd_check_connapr_dbd_set_dbnameapr_dbd_queryapr_dbd_selectapr_dbd_num_colsapr_dbd_num_tuplesapr_dbd_get_rowapr_dbd_get_entryapr_dbd_get_nameapr_dbd_errorapr_dbd_open_exapr_dbd_openapr_dbd_escapeapr_dbd_prepareapr_dbd_pqueryapr_dbd_pselectapr_dbd_pvqueryapr_dbd_pvselectapr_dbd_pbqueryapr_dbd_pbselectapr_dbd_pvbqueryapr_dbd_pvbselectapr_dbd_datum_getstrcasecmpapr_dbm_type_sdbmapr_dbm_type_dbapr_dbm_open_exapr_dbm_openapr_dbm_closeapr_dbm_fetchapr_dbm_storeapr_dbm_deleteapr_dbm_existsapr_dbm_firstkeyapr_dbm_nextkeyapr_dbm_freedatumapr_dbm_geterrorapr_dbm_get_usednames_exapr_dbm_get_usednamesapr_posix_perms2modeapr_pstrcatapr_sdbm_nextkeyapr_sdbm_firstkeyapr_psprintfapr_sdbm_fetchapr_sdbm_deleteapr_sdbm_storeapr_sdbm_closeapr_sdbm_openapr_file_unlockapr_file_read_fullapu__sdbm_chkpageapu__sdbm_getnkeyapr_file_write_fullapu__sdbm_splpageapu__sdbm_fitpairapr_sdbm_unlockapr_sdbm_lockapr_pool_cleanup_runapu__sdbm_hashapu__sdbm_getpairapr_sdbm_rdonlyapu__sdbm_delpairapu__sdbm_putpairapu__sdbm_duppairapu__sdbm_nullitemapr_file_lockapr_file_info_getmemmoveapr_base64_decode_len__assert_failapr_base64_decode_binaryapr_base64_decodeapr_base64_encode_lenapr_base64_encodeapr_hook_sort_registerapr_array_pushapr_hook_global_poolapr_array_makeapr_hook_sort_allapr_pool_create_exqsortapr_hook_debug_enabledstdoutfputcapr_pool_destroyapr_hook_deregister_allapr_hook_debug_showfwritefputsapr_optional_hook_getapr_optional_hook_addapr_hook_debug_currentapr_dynamic_fn_retrieveapr_dynamic_fn_registerapr_current_hooking_moduleapr_debug_module_hooksapr_global_hook_poolapr_ldap_infoapr_ldap_initapr_ldap_ssl_initapr_ldap_ssl_deinitapr_ldap_get_optionapr_ldap_set_optionapr_ldap_rebind_initapr_ldap_rebind_addapr_ldap_rebind_removestrncasecmpstrchrapr_strtokapr_ldap_is_ldap_urlapr_ldap_is_ldaps_urlapr_ldap_is_ldapi_urlapr_ldap_url_parse_extstrrchrstrtolapr_ldap_url_parseapr_socket_sendvapr_socket_closeapr_socket_createapr_sockaddr_info_getapr_socket_connectapr_memcache_add_serverapr_memcache_find_server_hash_defaultapr_reslist_acquireapr_pool_clearapr_reslist_releaseapr_reslist_invalidateapr_memcache_find_server_hashapr_memcache_find_serverapr_memcache_enable_serverapr_memcache_disable_serverapr_memcache_server_createapr_reslist_createapr_reslist_cleanup_order_setapr_memcache_createapr_memcache_hash_crc32apr_memcache_hash_defaultapr_memcache_hashapr_memcache_setapr_memcache_addapr_memcache_replaceapr_memcache_getpapr_memcache_deleteapr_memcache_incrapr_memcache_decrapr_memcache_versionapr_pstrmemdupapr_memcache_add_multget_keyapr_memcache_multgetpapr_hash_countapr_hash_firstapr_hash_thisapr_hash_nextapr_pollset_createapr_pollset_addapr_pollset_pollapr_pollset_removeapr_pollset_destroyapr_memcache_statsstrncmpapr_atoi64apr_date_checkmaskapr_date_parse_httpapr_time_exp_getapr_date_parse_rfcapr_time_exp_gmt_getapr_thread_cond_destroyapr_thread_mutex_destroyapr_queue_createapr_thread_cond_createapr_queue_pushapr_thread_cond_signalapr_thread_cond_waitapr_queue_trypushapr_queue_sizeapr_queue_popapr_queue_trypopapr_queue_interrupt_allapr_thread_cond_broadcastapr_queue_termapr_reslist_maintainapr_reslist_destroyapr_thread_cond_timedwaitapr_reslist_timeout_setapr_reslist_acquired_countapr_pool_pre_cleanup_registerapr_rmm_initapr_thread_rwlock_unlockapr_proc_mutex_lockapr_proc_mutex_unlockapr_thread_rwlock_wrlockapr_thread_rwlock_rdlockapr_rmm_destroyapr_rmm_attachapr_rmm_detachapr_rmm_mallocapr_rmm_callocapr_rmm_freeapr_rmm_addr_getapr_rmm_offset_getapr_rmm_reallocapr_rmm_overhead_getapr_thread_data_setapr_thread_exitapr_thread_joinapr_thread_createapr_thread_pool_createapr_thread_pool_destroyapr_thread_pool_pushapr_thread_pool_scheduleapr_thread_pool_topapr_thread_pool_tasks_cancelapr_os_thread_getapr_os_thread_currentapr_os_thread_equalapr_thread_pool_tasks_countapr_thread_pool_scheduled_tasks_countapr_thread_pool_threads_countapr_thread_pool_busy_countapr_thread_pool_idle_countapr_thread_pool_tasks_run_countapr_thread_pool_tasks_high_countapr_thread_pool_threads_high_countapr_thread_pool_threads_idle_timeout_countapr_thread_pool_idle_max_getapr_thread_pool_idle_wait_getapr_thread_pool_idle_max_setapr_thread_pool_idle_wait_setapr_thread_pool_thread_max_getapr_thread_pool_thread_max_setapr_thread_pool_threshold_getapr_thread_pool_threshold_setapr_thread_pool_task_owner_getapr_thread_data_getapr_env_getapr_filepath_list_splitapr_dso_loadapr_dso_symapr_dso_unloadapu_versionapu_version_stringapr_redis_add_serverapr_redis_find_serverapr_redis_enable_serverapr_redis_disable_serverapr_redis_server_createapr_redis_createapr_redis_hash_crc32apr_redis_hash_defaultapr_redis_hashapr_redis_pingapr_redis_find_server_hash_defaultapr_redis_find_server_hashapr_redis_setapr_redis_setexapr_redis_getpapr_redis_deleteapr_redis_infoapr_redis_versionstrstrapr_redis_incrapr_redis_decrapr_redis_multgetpapr_redis_stats__ctype_tolower_locapr_strmatch_precompileapr_uri_port_of_schemeapr_uri_unparseapr_uri_parseapr_uri_parse_hostinfoapr_pstrndupiconviconv_closeiconv_openapr_xlate_openapr_os_locale_encodingapr_os_default_encodingapr_xlate_conv_byteapr_xlate_closeXML_StopParserXML_ParserFreeapr_xml_parser_feedXML_ParseXML_GetErrorCodeapr_xml_parser_doneapr_xml_parser_geterrorXML_ErrorStringapr_text_appendapr_xml_quote_stringapr_xml_quote_elemapr_xml_to_textapr_xml_empty_elemapr_xml_insert_uriapr_xml_parser_createXML_ParserCreateXML_SetUserDataXML_SetElementHandlerXML_SetCharacterDataHandlerXML_SetEntityDeclHandlerapr_xml_parse_filedb_createapr_pmemdupdb_strerrorlibuuid.so.1libexpat.so.1libdb-5.3.solibcrypt.so.1libapr-1.so.0libpthread.so.0libdl.so.2libc.so.6_edata__bss_startlibaprutil-1.so.0XCRYPT_2.0GLIBC_2.2.5GLIBC_2.3GLIBC_2.25GLIBC_2.14/opt/cpanel/ea-apr16/lib64C& `�]�&_& ui	�&z&ii
�&����&����&ui	�&��"���"����"��"��"���"���"s0ȩ"�:Щ"�:ة"@9�" :�"�9�"9��"�8�"@8�"�7�"�7 �"p0(�"00�"�8�"@�"�H�"PP�"�X�"�`�" h�"�p�"��"���"����"�Ъ"�ت"��"��"��"��@�"�P�"@�X�" ���"���"���"����"����"�ث"@��"��"@��"��@�"�X�"��`�"`���"���"����"�ج"@���"G��"G��"G��""G��"�4й")G�".G�"4G�"9G�"=G �"AG0�"FG@�"KGP�"SG`�"[Gp�"dG��"hG��"lG��"qG��"xG��"��"�Ы"�P�"���"�Ь"���" �"`�" �"��"��"�(�"��"��"���";0�";p�";��";�"�h�"���"�(�"��"�p�"���"�0�"��"��"��"��"�h�"���"�H�"P�"X�"�`�"�h�"�p�"$x�"���"���"%��"S��"���"���"8��"k��"���"�ȯ"�Я"د"I�"��"��"���"��" �"(�"0�"�8�"@�"H�"�P�"�X�"�`�"h�"p�"x�"h��"(��"���"��"	��"X��"���"
��"��"dȰ"а"
ذ"��"�"�"��"��"��"�"��"� �"(�"0�"�8�"@�"H�"DP�"X�"`�"h�"p�"x�"���"��"z��"��"���"��"��"��" ��"!ȱ"jб""ر"#�"$�"%�"���"��"&�"��"'�"� �"�(�"�0�"(8�"@�")H�"�P�";X�"*`�"+h�" p�",x�"���"���"���"-��"���"���"���"e��".��"/Ȳ"qв"0ز"1�"2�"3�")��"��"��"4�"5�"6 �"7(�"0�"18�"8@�"9H�"NP�"�X�":`�";h�"<p�"=x�">��"?��"@��"A��""��"B��"\��"C��"D��"Eȳ"�г"Fس"G�"H�"��"I��"��"=�"J�"K�"L �"�(�"M0�"N8�"�@�"H�"P�"�X�"�`�"�h�"�p�"Ox�"��"P��"f��"Q��"R��"���"Q��"���"���"ȴ"Tд"Uش"��"V�"��"W��"X�"*�"Y�"/�"� �"Z(�"�0�"�8�"[@�"�H�"P�"[X�"\`�"�h�"]p�"^x�"_��"`��"a��"b��"c��"d��"U��"e��"f��"iȵ"�е"�ص"�"g�"h�">��"��"V�"i�"j�" �"�(�"l0�"m8�"n@�"H�"�P�"�X�"�`�"oh�"up�"�x�"p��"q��"r��"s��"t��"u��"���"���"v��"wȶ"xж"yض"z�"{�"|�"0��"W�"}�"~�"��" �"�(�"�0�"�8�"�@�"�H�"�P�"oX�"y`�"�h�"�p�"�x�"��"��"���"���"���"���"���"���"���"�ȷ"�з"�ط"��"��"T�"���"��"��"��"��" �"�(�"�0�"�8�"�@�"�H�"�P�"�X�"�`�"�h�"�p�"x�"���"���"���"��"���"���"���"���"���"�ȸ"9и"�ظ"��"��"��"���"��"��"��"���H��H��"H��t��H����5�"�%�"@�%�"h����%�"h�����%�"h����%�"h����%�"h����%�"h����%�"h����%�"h�p����%�"h�`����%�"h	�P����%�"h
�@����%�"h�0����%�"h� ����%z"h
�����%r"h�����%j"h���%b"h����%Z"h�����%R"h����%J"h����%B"h����%:"h����%2"h����%*"h�p����%""h�`����%"h�P����%"h�@����%
"h�0����%"h� ����%�"h�����%�"h�����%�"h���%�"h ����%�"h!�����%�"h"����%�"h#����%�"h$����%�"h%����%�"h&����%�"h'�p����%�"h(�`����%�"h)�P����%�"h*�@����%�"h+�0����%�"h,� ����%z"h-�����%r"h.�����%j"h/���%b"h0����%Z"h1�����%R"h2����%J"h3����%B"h4����%:"h5����%2"h6����%*"h7�p����%""h8�`����%"h9�P����%"h:�@����%
"h;�0����%"h<� ����%�"h=�����%�"h>�����%�"h?���%�"h@����%�"hA�����%�"hB����%�"hC����%�"hD����%�"hE����%�"hF����%�"hG�p����%�"hH�`����%�"hI�P����%�"hJ�@����%�"hK�0����%�"hL� ����%z"hM�����%r"hN�����%j"hO���%b"hP����%Z"hQ�����%R"hR����%J"hS����%B"hT����%:"hU����%2"hV����%*"hW�p����%""hX�`����%"hY�P����%"hZ�@����%
"h[�0����%"h\� ����%�"h]�����%�"h^�����%�"h_���%�"h`����%�"ha�����%�"hb����%�"hc����%�"hd����%�"he����%�"hf����%�"hg�p����%�"hh�`����%�"hi�P����%�"hj�@����%�"hk�0����%�"hl� ����%z"hm�����%r"hn�����%j"ho���%b"hp����%Z"hq�����%R"hr����%J"hs����%B"ht����%:"hu����%2"hv����%*"hw�p����%""hx�`����%"hy�P����%"hz�@����%
"h{�0����%"h|� ����%�"h}�����%�"h~�����%�"h���%�"h�����%�"h������%�"h�����%�"h�����%�"h�����%�"h�����%�"h�����%�"h��p����%�"h��`����%�"h��P����%�"h��@����%�"h��0����%�"h�� ����%z"h������%r"h������%j"h����%b"h�����%Z"h������%R"h�����%J"h�����%B"h�����%:"h�����%2"h�����%*"h��p����%""h��`����%"h��P����%"h��@����%
"h��0����%"h�� ����%�"h������%�"h������%�"h����%�"h�����%�"h������%�"h�����%�"h�����%�"h�����%�"h�����%�"h�����%�"h��p����%�"h��`����%�"h��P����%�"h��@����%�"h��0����%�"h�� ����%z"h������%r"h������%j"h����%b"h����%Z"h����%R"h���%J"h���%B"h���%:"h���%2"h���%*"h��p�%""h��`�%"h��P�%"h��@�%
"h��0�%"h�� �%�"h���%�"h���%�"h����%�"h����%�"h����%�"h���%�"h���%�"h���%�"h���%�"h���%�"h��p�%�"h��`�%�"h��P�%�"h��@�%�"h��0�%�"h�� �%z"h���%r"h���%j"h����%b"h����%Z"h����%R"h���%J"h���%B"h���%:"h���%2"h���%*"h��p�%""h��`�%"h��P�%"h��@�%
"h��0�%"h�� �%�"h���%�"h���%�"h����%�"h����%�"h����%�"h���%�"h���%�"h���%�"h���%�"h���%�"h��p�%�"h��`�%�"h��P�%�"h��@�%�"h��0�%�"h�� �%z"h���%r"h���%j"h����%b"h����%Z"h����%R"h���%J"h���%B"h���%:"h���%2"h���%*"h��p�%""h��`�%"h��P�%"h��@�%
"h��0�%"h�� �%�"h���%�"h���%�"h�����%�"h����%�"h����%�"h���%�"h���%�"h���%�"h���%�"h���%�"h�p��%�"h�`��%�"h	�P��%�"h
�@��%�"h�0��%�"h� ��%z"h
���%r"h���%j"h����%b"h����%Z"h����%R"h���%J"h���%B"h���%:"h���%2"h���%*"h�p��%""h�`��%"h�P��%"h�@��%
"h�0��%"h� ��%�"h���%�"h���%�"h����[�f.��H�=�"H��"H9�tH��"H��t	�����H�=Y"H�5R"H)�H��H��H��?H�H�tH�E
"H��t��fD�����="u+UH�="
"H��tH�=�"�i����d�����"]������w����ATL�gUSH�GL9�t:H��@H�]H�CH�H�{(H�H�H�SH�PH�C�PH��S0H�EL9�u�[1�]A\�ff.��+���ff.�SH��H��H�?H������H��[�����ATI�� UH��S���H�
"H��H�����H��H�(H�@L�`H��H�CH�C���H��[]A\�DATI��UH��SH��taH��H�RH�CH9�tH�����I�D$H9�t5I�D$H�UH�H�
H�H�MH�JH�SH�UH�SH�H�SH�BH�kH��[]A\�f�H�wH�?��H���ff.�@1���f�H������AWI��AVI��AUATUH�oSH��H�_H9���L�l$I���f�H�I)�H9���H�CL9�wH���u7H�CL��H��P(=�ucH�C1�L��L��H��P����H�CL9�w3L9�u�H�I�1�H��[]A\A]A^A_��H�GH�1��fDH�CL��H��P(H�I�H��[]A\A]A^A_�fD��f.�I�H���x[]A\A]A^A_�f�I��z����AWAVL�wAUATUSH��(H�_H�T$I9�����L�l$L�d$E1��H�I�I9�t3H�SH���u��t?H�C1�L��L��H��P��u9H�SH�I�I9�u�1�H�L$L�9H��([]A\A]A^A_ÐI�׉���f��ʼn���1�E1���AWH�GAVAUATI��USH��8H�_H�D$H9���H�D$(H��E1�H�D$H�D$ H�D$�LDL�l$(I�$O�t=I9�vI��I��M)�L�l$(H�t$ H��L��L���M94$v9H�M��H;\$t,H�C1�H�T$H��H�t$�P��t�H��8[]A\A]A^A_�E1�M�4$H��81�[]A\A]A^A_�AUI��ATI��UH��SH��H��H���}���H�4$L��H�t$��H�T$H��I�$H���X��u	H�T$H�UH��[]A\A]�AWAVAUATUSH�_H��8L�wD�H�t$H�T$I9�t{E��tyA�@�L�|$L�d$ H��H�l$(H��M��H�D$I��&H�D$ I��I�G�H�D$(I�G�M�6I9�tJM9�teI�F�L��H��L���P��t�H��8[]A\A]A^A_�E1�H�D$D�1�H��8[]A\A]A^A_ÐH�D$M��L+D$I��D�1����L�D$H�D$I��D�1��ff.�AWI��I��AVI��AUL�oATM��USH��H��H�oH�GL9�t
H��"H9Et}I��@��H�s�@��H�K�@H��"H��I���_���L�(H��H�CH�EH�CH�(H�kH�EL��L��L����LeH��1�[]A\A]A^A_�H�U(�:�v���H�JH�E HEH)�L9���L�L$H�SM��tBL��L����L�L$H��L�(H�SL��H�PH�SH�H�CH��L��[]A\A]A^A_��H��L��1�L�����L�(H�SH�PH�SH�H�C�I���DHBI���%�������ff.�AWAVAUATUSH�^H��XH�FH�\$0H9��LH�D$HH�L$(I��H��H�D$H�D$@1�H�D$H�G�T$H�D$8�=@H�D$8L�I�H�EI�GH�EL�8L�}H;\$(��I�D$H;D$0��M�|$�L$H�T$H�t$I�GL���PA��uH�D$@L�t$H�
L��H��H�D$ �,�I�WH����I�GI�H�I�I�OH�H�B���W���I����J���M��u=I�(�RL��A�W0L�t$HL�H;\$(�M���H��XD��[]A\A]A^A_�f.�H�L$ 1�1�M��H���\��uSI�W�f�E1��H+D$ L��H�p�R(I�GI�H�I�I�WH�PH�EI�H�EI�GH�EL�8L�}�y���A���q���ff.�f�H��A��L$H�L$���H���SH�GH��A�@H�O(H�W H�0H����uH�S(H�H��@H�S[�fD�����[�f�AWI��AVAUATUSH��H��H��HL�D$H�<$M����L��I��I��I��H��1�L�4H��DH�HH��H�H��I9�u�H��@��H�,$M��tW�H�SI�uI��I�}���H�(H�SH�PH�SH�H�CM9�u�H��HL��H��L��[]A\A]A^A_���I�uI�}1�I��H�K�1�H�(H�SH�PH�SH�H�CM9�u�1�H��H[]A\A]A^A_�DL�[H�CH;$�E1�H��"I9C�4H�s�@L�L$��H�K�@H��"H��I����L;t$L�L$H�D$sBM��H�\$L�d$I��M��I�_I�7L��I��I��H��I����M9�w�H�\$H�|$H�$H�H�CH�oH�GH�CH�81�H�{H��H[]A\A]A^A_�DL�[H�CH;$��H��"I9C�xI�C(�8�WE1�1�����H�s�@L�L$E1���H�K�@H��"H��I����L�L$H�D$����I�C(�8�����I�SI�s L�PH�I)�HpH�D$I��H�t$L9��H����M�iM9��}H�\$ H��L��M��L�d$(M��M��L�\$L�L$0H�L$8�DI��I�^L9��I�6L��H��I��I)���I��I�L9�u�L�\$H�L$8L��M��H+D$H�\$ I�SH)�L�d$(L�L$0H��H�I�SM����L�L$L��H��A��L�L$�������e���I�S1�H�1�I�S�q���H�s�@1���H�K�@H���!H���]�H�D$���H��t�H��H�L$L��M��M�,L�cH�3H��H��L����H��L�I9�u�M��I�V�x���L�\$H�L$8L��M��H+D$H�\$ I�SH)�L�d$(L�L$0H��H�I�SM���������H�s�@��H�K�@H��!H����H�D$�?���L�t$����ff.�AWI��AVAUI��ATI��USH��H�|$H�\$I��1��3D�ƒ�IWA�H�:H��t6I�>H��I����I�F�H��t:A���/v�I�WH�BI�GH�:H��u�1�H��u?H�Ę[]A\A]A^A_�DH�|$H��L��L��A������k�����DH�|$I��H��L��L�������AUI��ATI��UH��H��SH��H�����H��H��L��[L��H��I��]A\A]���@H���H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$�H�L$�D$H�D$H�D$ �D$0H�D$��H����fDATI��H��L��UH��SH��H��$�H�\$@H�t$H�D$H�t$H�D$H�|$ H�=,���H�\$H�D$(L�d$0H�\$8�#����tL�D$H�t$H��L��H��I)����H�Ā[]A\��H���L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$�L�D$�D$ H�D$H�D$ �D$0H�D$���H����ff.�SH��H��H��H��L��L�C���H�SH�H�SH�PH�SH�H�C[�f.��1��ff.�f����f.����f.����f.��f.�DH��H�wH����1�H����S��H�����H��t-H�PH�J H�H�ZH�BH�BH�HH��[�D1���ff.��UH��SH���2�H���Z�H��t)H�(H�
�!H��H��H�^���H�����H��H��[]�H���d��H���+������ff.�@SH��H�?H��tH�
���H������H�sH�{[�'���H���w��ÐH��H�H��(���H��H��H�fDUH��SH�_ H��H���wRH�VH��tH�BH�FH�B H��[]�fDH�^H�SH���H9K vCH�jH�ZH��H�K��fDH�~H���<�H��t�H�PH�jH�BH��fDH�~����H�EH��tH�PH�H��H����H�]�h���ff.�f�H��H�G�uH�PH�� H�WH�xÐH�w�H�x����H�1�H��ff.�@H��!H��H�GH�G H�G(H�W�f�SH��H���@��H���!H�H��H�@H�P0H�X8[��AVI��AUATI��U1�SH��H�_(H�D$L�kL������L��H��������u�;��H�|$L��L��~"�m����tQ��H����[]A\A]A^�����H�{L�������uL�cH�D$H�CH����[]A\A]A^��I�v8�(����oC@�oKH�K$��H$L�`�+H��I�F(H�D$H�C�SH������u[ÐH��[���AWAVAUI��ATI��USH��8H�_(H�W H�4$H�oH�s�CH�T$ H�t$����A��L�KH��@wcH����H�|$(A�H��������usH�t$(H��1�L���!�H���Y���I�ED��L��H�4$L��PA��H��8D��[]A\A]A^A_�H�|$(A��@�k����uI�E�@L��@�P(뎐H�t$H���c�A���t>H�t$H�|$(��D��L�C1�H�t$(��H�|$�q�A�Dž��t���H�D$H�CH9k H�$H��HF{ I�u8H�I�<$�9�H�|$H�T$ 1�I���%��A�Dž���H�|$L��L�����=~A��A����t	E����I�$L��L��D�L$H�
��!H)����H����D�L$E��twI�u8�@��H�T$ I$H�P H���!H�
v�!H�hH�PI�U8L�hH�P8I�UH�X(H�I�UH�H0H�BI�EH�$L�0�i���L���P���Y���H�������ff.�AVI��AUM��ATI��UH��SH�w8H���(��H��L��H��L�pH��L�h�@H�@ @�#�H���!H�P[]A\A]A^�ff.�@AVI��AUI��ATI��L��UH���@SL����M��L��H��H�l�!H�H��H�@H�P0L��H�X8[]A\A]A^��f.�H�G(�p1��fDUSH��H�o(H��@wH�E @H��1�[]�@H�8H���,��H9�HF�H�E H��1�[]��H�1�H��ff.�@H��!H��H�GH�G H�G(H�W�f�SH��H���@��H�x�!H�H��H�@H�P0H�X8[���H�O(H�G HAH�H�GH�1���SH���W���tH�{�SH��[�C��[�ff.�AVI��AUI��ATI��UH��SH��H�w8� �
�H��M��t:L�pH�hL�h1�H��H��L���&�H���!H�PH��[]A\A]A^�fDH�hI�t$8H�����H�CH��tH���!L��H��H�SH�������H��H�D$���H�D$�ff.��AUI��ATI��H��UH���@SH��H���M��H�&�!L��H��H�H��H�P0L��H�@H�X8H��[]A\A]�\��f.�f�H�G1��DH�G(H�@H��tCATI��H��UH��SH��H��H�W H�|$�����uH�T$I�$H�SH�UH��[]A\���f.�SH������t3H�CH��tH�8H�p���H�����H�{�o��H��[�f��fD[�ff.�AVI��AUI��ATI��UH��SH�w8��.��I�<$H�
3�!H����L�`H��H���-��L��L��H��H���<��H���!H�P[]A\A]A^��AVAUATUSH��L�o(I�mH��twI��H�}H��E1��5����tH��D��[]A\A]A^ÐH�|$H��H���p��A�ƅ�u�L�����I�L$I�T$ L��H�t$�z��H��D��[]A\A]A^�f.�H��A�[D��]A\A]A^�f.�AUI��ATI��H��UH���@SH��H���
��H���!L��H��H�H��H�P0L��H�@H�X8H��[]A\A]����f.�f�H���!H��H�w(H�WH�����H�WH�W �ff.�UH���@SH��H�����H�c�!H��H�H��H�@H�P0H�X8H��[]���AWI��AVAUATI��UH��SH��L�w(����H�H�w8�@H�@� ��H��L��H��I�������t��~��H�UH��uDL������1�H�5�vL���k��H�@(I���~��1�H����[]A\A]A^A_�DH�
��!L��L������L��H��H�@(H�s8H�@@M�/���H�XH�H�H�H�BH�1���L���X���fDH�t$L����1�L�����I�t$8�@I�H�E@���L��H��H��I�����H�t$L�����k�����fDL��1����������H�G(H�x(tH�@ HG H�H�GH�1��H�
q�!H�@H�O��ff.�@SH��H�w0H����H�s H�SH�CH�����H�C 1�H�C([��H�(tSH���P����u[�f.�H���!�`fDH�{(H��H��������H��[���@AVI��AUI��ATI��UH��SH�w8�8����L��H��1�H��L�p L�h(H�E8H��H�C0���H�{(H��H�
��!H��H��!H����H�EH���!L�cH�CH�C���[H��]A\A]A^�AUI��ATI��H��UH���@SH��H���]��H�6�!L��H��H�H��H�P0L��H�@H�X8H��[]A\A]���f.�f�SH�_(�&����u�[�ff.�f�SH�_(����1�[�ff.�@1��/����H�w(H��H�W H�O��f.�H�G HG(H�H�GH�1��ff.�UH��SH��H��H�w8�@�v��H�E�o�oKH�oS P �o[0X0H��1�[]��H��H�WH�w 1�Hw(�i��H���H�����ff.�H9wrJUH��SH��H��H�t$����H�D$H�kH�XH�H)hH�H�Hh H�BH�H��1�[]�fD��f.�H�WH�e�!H��H�w(H�G H�WÐATI��H��UH���@SH���v��H�O�!H��H�H��H�P0L��H�@H�X8[]A\����ff.�H�WH���!H��H�w(H�G H�WÐATI��H��UH���@SH�����H���!H��H�H��H�P0L��H�@H�X8[]A\����f.�@H�!�!H��H�w(H�WH�����H�WH�W �ff.�UH���@SH��H�����H�c�!H��H�H��H�@H�P0H�X8H��[]�#��AWI��AVAUATI��UH��SH��L�w(����H�H�w8�@H�@� ��H��L��H��I�������Å�t��~��H�UH��u4L��1�����1�H�5�pL���i��H�@(I�H����[]A\A]A^A_ÐH�
��!L��L������L��H��H�@(H�s8H�@@M�/�@��H�XH�H�H�H�BH�1���L���h���fDH�t$L������1�L���y��I�t$8�@I�H�E@�+��L��H��H��I������H�t$L�����;�����fDH�-�!1��f�H�= �!t1��UH��SH�����H��H��tbH9�u�[H��H�����H����H9��„�u�H���}��H�����H�
��!H��1�H�����H���!���H��1�[]�DH���ATI��UH��SH���)��H�
R�!H��H�8L� H��H�h�I��[1�]A\�f�H��1��v��fDH������1�H���SH��H�wH�?�0��H�1�H�C[�ff.�f�H��t+1�E1�fD�2H��A	�H9�u�A�������f���f.�AWAVAUI��ATI��UH��SH��H��xH��tH�����A�Dž�tH��xD��[]A\A]A^A_�@H�=y�!H�����H���R��I�$H��t	�t����f�H�=Q�!L�t$ ����H�� L��H�$H�VR1��2��L�T$@H��1�L�׾"L�T$H�DR���L�T$L�$L��H�t$H�|$L���a������=���A������H���/���H�;�%���L�,$�L���R���H�xH��H��H�Hǀ�H��1�H)������H�L�����f��H��H�@I��H�|$�P��I�l$L��L�����I�$L�#���@H�D$H�HH��tH��L��H�<$�х��0���H�D$I�$H�<$H���Y��I�$H�=��!H�����H������q���f.�H��ff.��H�F�`xf��fff.�f�H�F�`f�H�F�` f�H�B���fDH�D$(H�@�`(@H�B�`0f�I�@�`8f�H�B�`@f�H�A�`Hf�I�@�`Pf�H�B�`Xf�H�G�``f�H�G�`hf��gpf.�S1�E1�f.�D��A��A����B�A�ɈlA����D�L�LH��9�w�[�ff.�AWI��AVAUATUSH��H�D�_D�OD�WH��H�l$@H��fD�F�NH��H������	��N�	��N���	ȉB�H9�u�D��D�,$D�ދD$D1�D1�D��D�d$D!�E�tDЋL$D1�D�D�A��C�,A��D!�D1�D1��D���!�1�D1���!�D1�Dt$ȉ��
1�!�1�t$D���1�!�1���T$��1�!�1�D$Չ‰��1�!�1�L$ Љ��
1�!�1�ʋL$$��A�։��1�D!�1�l$(ʉ։��D1�!�1��ыT$0��D$,��D��D�1�!�D1�A���A1΋l$<��
A!�A1�t$4A։��A��1�D!�1�L$8։ʉ���D1�!�A��1���D��1�!�D1�G��5�y�Z‰��
	�!�A!�D	�D�|$D�E��7�y�Z���A��	�A!�!�D	�A��D�D�t$ A!��E���y�Z��	�!�D	�D�|$0D�E���y�Z���	A��	�A!�!�D	�A��D�D�t$A!��
E���y�Z��	�!�D	�D�|$D�E��7�y�Z���A��	�A!�!�D	�A��D�D�t$$A!��E���y�Z��	�!�D	�D�|$4D�E���y�Z���	A��	�A!�!�D	�A��D�E���y�Z��A!��
	�!�D	�A��D�D�t$A!��E��6�y�Z��	�!�D	�D�|$(D�E���y�Z���A��	�A!�!�D	�A��D�D�t$8��	E���y�Z��	�A!�!�D	�D�|$D�E���y�Z���
A��	�A!�!�D	�A��D�D�t$A!��E��6�y�Z��	�!�D	�D�|$,D�E���y�Z���A��	�A!�!�D	�A��D�D���y�Z��A!���		�!�D	�D�|$D�E�����n���
1�1�D�D�t$ ��E��6���n��1�1�D�E�����n���	1�1�D�D�t$0D�|$(��E�����n��D�t$1�1�D�E�����n���1�1�D�E��7���n��D�|$8��1�1�E�����nD�|$$D�E�����n�щ��	1�D�t$1�1�D�1�D�E�����n��D�t$��1�1�D�E��7���n��D�|$4��1�1�D�E�����n��D�t$��	1�1�D�E�����n��D�|$,��1�1�D�E�����n��D�t$��1�1Ѝ����nD�E��7���n���1�1��D�E�����n�щ��	1�A�1�1�D�1����A�A�A�@E�XE�HE�P���H��H[]A\A]A^A_�f�H�#Eg����H�GH�H��ܺ�vT2H�G1�H�GX�f�UH��SH��H��H��H�t$�����u�T$��tH�]XH��[]�H���[]�@AW1�I��AVI���AUATUH��S�@H��h�GA��A��A��?ЋW���GD������D)��A�ىGD��H�XM�lM9���H���!H�T$L�D$L��L�L$L�L$L�$���L�$M�oL��L�$L���j����L�$D)�I9��mH�D$L�d$ H�$H�D$H�D$�BH�T$L�$L��H�D$@H�D$@�E��L��L���
����S�C@L9�s'A��L��I�XJ�t
H��u�L������S�C@L9�r�I�XH�I)�H��t9H�T$L�D$L��H��L�t$L�t$����H��h1�[]A\A]A^A_�f�L��H��L�������A��s:A����E������A�EA������D���T�fA�T�����H�I�MH��H��I�ED��H�T�I�T�I)�L)�E�A��A�������A��1��ƒ�H�4H�4D9�r��p���DL�I�XM)������A�ED�ȋT�A�T��E���f�AT�I��USH��H��H��H�l$H���L����CH�CX����?��7wf�8)�H��H�55�!�p���H��H�ߺ�`���L��H�޺����H�{H�1�H��H�CXH)��K`���H�H��[]A\�f��x)���AUI��ATI��UH��SH��hH��H���½��L��H��H�������uH��L���e���H��h[]A\A]�f.�S1�E1�f.�D��A��A����B�A�ɈlA����D�L�LH��9�w�[�ff.�AWAVAUATUSH���D�OD��D$��G�D$�@���{�\$��T$�E�ˋE1�D�v��D1��L$�G��>�p $D!�D�t$�D�v$1؍�x�j׋V���T$���V���D��D�E�ˋ^(!�A1É�D1��D��D�^���G���ν�D�\$�D�^,!�1�D1�D�\$�D�A��n��щl$�A!�A��A1�E�D�VA��
D�T$�E���|���A�1�E1�D!�1�D�D��*ƇGD��D�n��D�D��!�A�ĉl$�1�D�E��
F0�E��A1���D��D�n!�A1�D1�D�G���F�E��D�f ���D�d$�A!�A1�E�E��ؘ�i��A��
1�A�D!�1�D�E����D����D1�D�!�A��1�D�D���[��D����1��!�D1�D�G����\�D�^0��A1��E��D�\$�D�f8A!�A1�E�E��"�k��A��
1�A�D!�1�D�D�V4��E���q����D�D1�!�1�D�E���Cy�D����1��!�D1�D�D�^<���1��G��!�I!�1�D�D�D$���
�E��b%���1�!�1�D�D��@�@����1�!�1�D�D�D$���	�E��QZ^&��1�!�1�D�D�D$����E��0�Ƕ��1�!�1�D�D�D$����E��]/։�1�!�1�D�D��SD���1�!�1�D�E����؉���	�1�!�1�D�D�D$��l$����E��0����1�!�1�D�E�����!����1�!�1�D�E���7É��1�!�1�D�D�D$���	�E���
��1�!�5�ZE��1�D����1�A��l$�A!�A1�A�A���㩉�A��A�D1�B���L*�!Љl$�1��t$���D������D��1‰�!�A��
�ogD1����	�1�D!�1�Ή���1�!�A��l$�A1�DD$�A����B9��A�D1���D$�������q���D�D1�1�‹D$�����0"a�mD���1�G��8�1�Ɖ��1��1�D�D�D$���	E��D꾤���1�1�A��5`K��1�D�D�D$����A�����KA��l$�A1�AЉ�p���A��1�A�D1����D1�D�1��A��
�~�(D����	1��1���D$���F���'����1��0��1�D�A��A1��A1�AЋT$�A����2���A�1�A��9���D1�։��	D1�D�1�ʋL$��������D���1�1��C���|�A��A1��A1�A��D$�A����0eV�ĉ�A�1�D1��t$���	��D")��D���	�D1��A��
��*CD��D�l$�����G���#��D�d$��	�1����
���	�1�D�E��9���A���A���D��A��	�A��1�D�D�D$����E���Y[eD��	�1�D�D��
�����l$������	�A��1�A��D�D��3}����
���	�1�D�D�D$����E���]��D��	�1�D�E��O~�oA���A���D��	�1�D�E����,�������	�A��1�A��D�D��5C����
��A���ND�T$��	�1�A���~S�D�E��A���A���A	�A1�A�D��A��A�D	�1�ЋT$�����
5�:���D���	�D1�ʋL$���
��1���*D����G���ӆ�	�1���D$����։�	�A�	1�D��A��A�D�T$�D�O�O�WH��[]A\A]A^A_�@H��H�t$�L�T$H����BD�BH��H��A����D	�D�B�D	�D�B�A��D	��A�I9�u��1���@AWI���A�@AVAUI��ATI��U��1�SH��x�GA��A��E��A��?ЋW���GD����������E)�Ѓ�D��D�ˉGH�XI�LH�$H����!�L9��I�ބ������N������t�H�$������I�EL��D�T$H��H�$�0���D�T$�D)�I9��zH�D$(H�D$H�D$0H�D$H�D$ H�D$�$f.�L�����A�VA�F@L9�sX��I��I�}XI�4H��t�@��t�H�\$H�T$H�D$(@H�D$ @L�D$H���;���H��L�����A�VA�F@L9�r�I�}XI�I)�H����!�u%H�<$L��L���N���H��x1�[]A\A]A^A_�DH�$H�T$ L�D$(L��L�|$(L�|$ �ȵ����fDH�$H�H��H���H�T�H�T�H��H�IH��H)�H)�؃����������1��ƒ�L�L�9�r����H�T$ L�D$(D�T$H�\$(H�\$ �J���D�T$�X���I�}XI�I)�H����!������H�$��؋T��T��*�����H�$�T�f�T�����ff.�f�H�#Eg����H�GH�H��ܺ�vT2H�G1�H�GX�f�UH��SH��H��H��H�t$�G�����u�T$��tH�]XH��[]�H���[]�@1�����f�AT�I��USH��H��H��H�l$H���\�CH�CX����?��7wf�8)�H��H�55;�Я��H��H�ߺ���L��H�޺��H�{H�1�H��H�CXH)��K`���H�H��[]A\�f��x)���AUI��ATI��UH��SH��hH��H������L��H��H���D�����uH��L�����H��h[]A\A]�f.�AWAVAUATI��H�=�9USH��H��H�L$(��H�T$ H�S����HE��H�T$���"<$�H��H�JH���������$��H9�u�H�D$H�\$@H��$�H��L�l$0�@���L�����L��H��H���j����H�5C9H���V���L�t$L�|$H��L��L���>���H�����L��讱��L��H��H��� ���L��L��H������L��花��L��H��H�����H��L��衻��L���i���I��H��t7L�x�H�@�H���I)�f�I���L��H��INֹI���_���M9�u�f�L��)D$0����I��H��u#�<���L��H���#���I�tA��u�L��H���X���I�u�1$H�t$H��$DŽ$$aprf��$H�T$I��H��H�D$Ƅ$�1���L���
H����������!�%����t�H��L��I��������������D�H�JHDщ���$H��1�f��k����fDL���(���L��H��H��蚬��H��I��H��H�RH9���H�%I�$I�$IH��H��H��?H�H)�H��H)�H9���M��ta��L��H�����H��L��H���ݹ��H�����H��I���ի��A���[�����L��H������W����L���h���L��H��H���ګ����L���H���L��H��H��身���_���DH�T$H�t$H��螫������H�|$�H����������!�%����t������D�H�WHD��T$0����D$6H�
S6H������H��	��D$<	�H�GHc�fDI��H��H��A��?F�D�F�H9�u��T$1�t$7L�G����	��t$=	�Hc�H��H��H����?�41@�p�L9�u��T$2�t$8L�G����	��t$>	�Hc�DH��H��H����?�41@�p�L9�u��T$3�t$9L�G����	��t$?	�Hc�DH��H��H����?�41@�p�L9�u��T$4�t$:L�G����	��t$5	�Hc�DH��H��H����?�41@�p�L9�u��D$;�Gf�H�t$)D$0H��H����?���G�WH�T$(H�|$ H������H�Ĉ1�[]A\A]A^A_�H+D$H�D$����H�D$����f�ATUH��SH��H����>$���H�=_4H�������� �H�=�4H�������u>H��L�d$���L��H����d���H��L����������E�H���[]A\������I�ĸM��t�AƄ$�H��L��H������H�Ǹ�H��tH��轰������E�L��D$�G����D$H���[]A\���~2�����F<at<y�����{$�����L�d$��H��H��L��贶��H���'����֨����0����L�d$��H��H��L��蠲�����ff.�AU��M��A�(ATM��UH��H�=�3SH��8H��I���c���H��t.L��D��H��H���-���1�H��tH��8��[]A\A]�f��;����H��8[]��A\A]�f.�f�AVH�OAUATUSH���H�T$�L�B@H�А�1H��H���p�L9�u�H����B43B H��3B3B���B<H9�u�D�D�G�D$�D�OD�ڋwD�WE����\$�A��D�d$�A���y�ZD��D�t$��D������y�Z1�G��!�y�ZD!�1��D��1��D!��D1��ȉ�D1��!��1��B��5�y�ZD�t$�D��D��1�A��!�A��D1��G��5�y�ZD�t$��A܉�1�D��!��1�B��2�y�ZD�t$�D��݉�1�A��D!�A��1�A��B��0�y�ZD�t$��D�A��E1��A!��A1��B��1�y�ZD�t$�D��D��1�A��!�A��D1��G��4�y�ZD�t$��A�L��1�A��!�A��1��B��5�y�ZD�t$�D�A��D�A1�A��A��A!��A1�B��2�y�ZD�t$�D�A��A1�D�A!��A��A1�A��B��3�y�ZD�t$�D�A��A1�D�A!��A��A1�A��B��1�y�ZD�t$�D�A��A1�D�A!�A���A1�A��B��0�y�ZD�t$�D�A��A1�D�A!�A��A1�A��B��5�y�ZD�t$�D�A��D��A1�A��A!�A��A1��B��2�y�ZD�t$�D�A��1�E��!�A��1��B��3�y�ZD�t$��D�A��A1ĉ�E!��A1�A��B��1�y�ZD�t$�D�݉�D1�A��!�A��1��B��0�y�ZD�t$��A�D��1�A��!�A��D1�G��5�y�Z��A���1�A��!��1�A��D�A�݋\$�D�D�����n��A��D1�A��1��D�A��T$�A�܍����nD��A��1�1���l$�D�E��-���n��A��1�A��1��D�D�l$�E�$.F��)���n��D��1��1�D�͉ыT$��A��D�����n��A��1�D1�D�A�D��D�d$��A��F��#���n��A��1�1��D�D�d$�D�F��!���n��A��1�A��1��D�D�d$�D�F�� ���n��A��1�A��1��D�D�d$�D�F��%���n��A��1�A��1��D�D�d$�D�F��"���n��A��1�A��1�D�D�$$D��F��#���n��A��1�A��1��D�D�d$D�F��!���n��A��1�A��1��D�D�d$D�F�� ���n��A��1�A��1��D�D�d$D�F��%���n��A��1�A��1��D�D�d$D�F��"���n��A��1�A��1��D�D�d$D�F��#���nA�։�A��1�1��D�E�,�\$E�썜���n��A��1�1��ً\$D�D�����n��A��1�A��D1�A��D�A��D$ A�܍����n��A��D1�1���l$$D�D��*���nD��A��1�A��1��D�A�,��A��	�A!�A��!�A��D	�D�t$(G��5ܼ�A��D��D�A��A!�A	�A��A!��E	�D�t$,A��B��1ܼ�A��D�A��A!�A	�D�A!��A��E	�D�t$0A��B��3ܼ�A��D�A��A!�A	�D�A!��A��E	�D�t$4A��B��0ܼ�A��D�A��A!�A	�D�A!�A��E	�D�t$8A��B��5ܼ�A��D��A��A	�A!�D�A!��A��E	�D�t$<A��B��2ܼ�A��D�A��A!�A	�D�A!��A��E	�D�t$@A��B��1ܼ�A��D�A��A!�A	�D�A!��A��E	�D�t$DA��B��3ܼ�A��D�A��A!�A	�D�A!�A��E	�D�t$HA��B��0ܼ�A��D��A��A	�A!�D�A!��A��E	�D�t$LA��B��5ܼ�A��D�A��A!�A	�D�A!��A��E	�D�t$PA��B��2ܼ�A��D�A��A!�A	�D�A!��A��E	�D�t$TA��B��1ܼ�A��D�A��A!�A	�D�A!�A��E	�D�t$XA��B��3ܼ�A��D��A��A	�A!�D�A!��A��E	�D�t$\A��B��0ܼ�A��D�A��A!�A	�D�A!�A���E	�D�t$`A��B��5ܼ�A��D�A!�A��	�E��!��D	�D�t$dA��B��2ܼ�A����A!�	�D�D!�A��D	�D�t$hA��B��1ܼ�A���A����D	�E!�D�!�A���D	�D�t$lA��B��3ܼ�E���A!�A�,D��	�A��!�A��D	�D�t$p��B��0ܼ�A���A!�A���	�A��!�A��D	�D�t$t��G��5ܼ�D�D�D�d$xA��F��"�bʉ�A��1�1��D�E�,�T$|E��bʉ�A��1�1���E�$��$�E�捌�bʉ�A��1�D1�A���A�,��$��鍜�bʉ��D1�D1�A���ы�$�A�΍��b�D��A��D1�1���A���$�A��E���b�D��A��1�1��D�A���$�A��E���bʉ�A��1�1��D�D��$�D�F��%�bʉ�A��1�A��1��D�D��$�D�F��!�bʉ�A��1�A��1���D�D��$�D�F��"�bʉ�A��1�A��1��D�D��$�D�F��#�bʉ�A��1�A��1��D�D��$�D�F�� �bʉ�A��1�A��1��D�D��$�D�F��%�bʉ�A��1�A��1�D��E�,.��$�E�)�bʉ�A��1�1����E�$��$�E�捬
�bʉ�A��1�D1�A���A���$�A�΍��bʉ�A��D1�D1�A���A���$�A�ލ��b�D��A��D1�1���A�,��$�A��A���b�D��A��1�1��Ћ�$�D�E���bʉ�A��1�A��1��D�E�$��$�A���b�щ�E��1�A�D�W1���w�D��D�D�G���GʉH���[]A\A]A^�ff.�H�#Eg�����GH�H��ܺ�vT2H�G�����H�G�G\�ff.�f�AW��1�I��AVL�wAUI��ATU��SH��G�W���G������ЉGHcG\��tv�@I�<)�9�F݉�H��H�L$誢��A�G\�A�G\��@�"H�L$M�g\L����pH���x�D�@�@�p�D�@�@�x��P�L9�u�L��)�I����?�
�]�M�g\��H��H��L�D�AoEL��I��@A�AoM�AN�AoU�AV �Ao]�A^0fD��HH���p��x��H�@�x�@�p��P�L9�u�L����I9�u���?��rWH�I�vH��I�G��H�T�I�T�I)�B�D5L)���r��1҉у�H�<H�<9�r�A�o\H��[]A\A]A^A_�@��u(��t��A�G@��t։��T�fA�T���L���v����A�G��T�A�T��D�۝��ff.�AWAVAUATI��UH��SH�^H��D�vD�~D�����?�HH��D�Hc�H؃�8���@)ʉ�t1҉փ��09�r�M�l$\H��@��HH���p��x��H�@�x�@�p��P�L9�u�L���:�f�AD$H�C0CC ��SH���K��{��S�@�{��K��C�L9�u�E�|$TL��E�t$X���1�A��шt���T�L����LH��H��u�H��[]A\A]A^A_ú81�)ʃ�rJ��H�H�D�H�HH��H)�ƒ��r��1��ƃ�H�<19�r�M�l$\�?������u$L�n\���'����������1�f�L������L�n\�D�����AUA��ATI��USH��H��H�l$ H���]���D��L��H���?���I��H��L���!���H�ߺH�5"蝘��H�{L���\���H��DH�Ĉ[]A\A]��I�modnarodAUH�setybdetI�arenegylATA��UA��H��SL�
L)�H�RH�M1�H1�L1�I�uespemosM1�H9�sqI���I�H1؅�t?E1�I�I�H��
A��H��L1�I�� L1�I�H��I�H��L1�L1�I�� D9�u�I��I1�L9�w�I��I��L�H��H�|�L�!H��8Oc�M�A��D�WI��0L	�D�WI��(L	�D�WI�� L	�D�WI��L	�D�WI��L	�D�WI��L	��?H	�H1��t>1�DI�I�H��
��H��L1�I�� L1�I�H��I�H��L1�L1�I�� 9�u�I1�A���E��t=1�I�I�H��
��H��L1�I�� L1�I�H��I�H��L1�L1�I�� A9�u�I1�[]M1�A\L1�A]��SH��H��H��H��D��E��舔��H�[�A��SI��H�BA��H�I�modnarodH�setybdetH�arenegylM)�H1�L1�I�uespemosI�H1�L1�L9���I���M�H�H��
I��H1�H�� L1�H�H��H1�H�H��H�H��H1�H1�H�� H�H�H��
H��H1�H�� H1�H�H��H�H��H1�H1�H�� L1�M9�w�I��I��M�I��J�|�L�
!H��8Oc�M�A���D�GI��0L	�D�GI��(L	�D�GI�� L	�D�GI��L	�D�GI��L	�D�GI��L	��?H	�H1�H�<H��
[H�H��H1�H1�H�� H�H�<H��H��H1�H1�H�� H�H�H��
H��H1�H�� H1�H�H��H�H1�H��H�� H1�H1�Hƀ�H��
H1�H�� H�H��H1�H�H��H�H��H1�H1�H�� H�H�H��
H��H1�H�� H1�H�H��H�H��H1�H1�H�� H�H�H��
H��H1�H�� H1�H�H�H��H��H1�H1�H�� H�H�H��H��
H1�H1�H��H�H��H1�H�� H1�H1��f�SH��H��H��H���n���H�[�f�I�uespemosSH�A��H�arenegylA��H�RI�setybdetI�modnarodH1�L1�I��M)�I1�I1�I�L9���H���H�
L�I��
I1�H�� I1�L�I��I1�L�I��L�I1�I��I1�H�� L�I��
L�I��I1�I1�H�� L�I��L�I1�I��I1�H�� L�I��
I1�H�� L�H��I��I1�L�I��L�I��I1�I1�H�� L�L�I��
I��I1�H�� I1�L�I��L�I��I1�I1�H�� H1�I9��*���H��H��I�I��J�|�H�
=H��8Jc�H��@�WH��0H	��WH��(H	��WH�� H	��WH��H	��WH��H	��WH��H	��H	�I1�L��M��H��
I��L1�I�� L��H�H1�H��H��I�H��H1�L1�H�� I�H��
H1�H�� I��H�H��H��H1�H�H��I�<H��H1�H�� H1�H�H��
H�H��H1�H1�H�� H�H��H�H��H1�H1�H�� H�H��
H�H1�H��H1�H�� H�H��H�H��H1�H�� H1�H1���H�H��
H�H��H1�H1�H�� H�H��H1�H�H��H1�H�� H�H��
H�H1�H��H1�H�� H�H��H�H��H1�H1�H�� H�H��
H�H1�H��H1�H�� H�H��H�H��H1�H1�H�� H�H��
H�H1�H��H1�H�� H�H��H�H��H1�H1�H�� H�H��
H�H1�H��H1�H�� H�H��H�H��H1�H1�H�� H�H��
H1�H�� H�H��H1�H�H��H�H��H1�H1�H�� H�H�H��
H��H1�H�� H1�H�H��H�H��H1�H1�H�� H�H�H��
H��H1�H1�H�H��H1�H��H1�H�� H1��ff.�f�SH��H��H��H���ޖ��H�[�f�Lc�H�
�I��W��VA��A��D	���G����<��H�FI9�v^H���F�H��A����	�A��?��G�B�	�G�I9�v*��������0��H�VI9�w���G�D������G�ff.�AWI��L�=4*AVA��AUA��E1�ATD��UA��1�S��j?$D�d$�E1�E1�1�1�E�����E��D	�E��D	�E��t]A��A��E	�E��uI��A��tA����@I��A��u�D$�1ȉL$�A	�B�D��1É.�*H��H��HtA�/�@E��u�I���fDD��A��	D#d$�[��]A	�A������A!�D1"A\A]A^A_�f.��F�H�T���H��ȉG�H9�u��ff.�@AWAVAUATUSH��H�t$8H�T$@��<��H�\$8�;$�n�{2�d�C�P����TL�}��aA�<�?�{$�5�C�PЀ��%�S�JЀ�	�I����7~<1�H�\$8�{$��������A��LB�A��E9���H�\$8H��$�H�CL�CH�{H�\$`H�\$H�H�Z���?���H�� ��_��D�D��A��?w��A��D	ڈH9����P�� ��_w^D�D��A��?wP��A��H��D	وN�H��� ��_w3���?w*��H��	ʈV�L9�tG��� ��_�Y���f.��k����1�H��[]A\A]A^A_��L����"1���H�\$H�H���L�����H�D$8H��HL��L���@��aA������H��1�H�5��H�L��1�A��A��Ic�A��H��$Mc��T�`3�$`1�F����D3�$dA������A����E�ɋT�`B��`D��3��`B��`3�$hD1�1�A�ȉ���A����E���T�`B��`D��3��`B��`3�$l1�A������A����E���T�`B��`D��3��`B��`3�$p1�A�ȉ���A����E���T�`B��`D��3��`B��`3�$t1�A�Љ���A����E���D�`B��`D��3��`B��`3�$x1�A������A����E���L�`B��`D��3��`B��`3�$|1�A�Љ���A����E���L�`B��`D��3��`B��`3�$�1�A������A����E���L�`B��`D��3��`B��`1�A�Љ���A����E���L�`B��`D��3��`3�$�B��`1�3�$�A������A����E���L�`B��`D��3��`B��`3�$�1�A�Љ���A����E���L�`B��`D��3��`B��`3�$�1�A������A����E���L�`B��`D��3��`B��`1�A�Љ���A����E���L�`B��`D��3��`3�$�B��`1�3�$���H��A������A����E���L�`B��`D��3��`B��`3�$�1ʉ�A���A����F�D�`D��`��D3��`��3�$�D��`D1�A������A����E���L�`B��`D��3��`B��`3�$�1щG��O�������H�\$H��H��L��f���$�3�$`H��1ȉƉ�����@���L�`��`��3��`�΋�$�3�$dA����3�$h��`��D1�1щΉ����@���T�`��`��3��`��3�$l��`1ЉƉ����@���T�`��`��3��`��3�$p��`1щΉ����@���T�`��`��3��`����`1‰։����3�$t@���D�`��`��3��`��3�$x��`1ȉƉ�����@���L�`��`��3��`����`3�$|1ʉ։����@���L�`��`��3��`��3�$���`1ȉƉ�����@���L�`��`��3��`����`1ʉ։����@���L�`��`��3��`��3�$���`3�$�1ȉƉ�����@���L�`��`��3��`��3�$���`1ʉ։����@���L�`��`��3��`��3�$���`1ȉƉ�����@���L�`��`��3��`����`1ʉ։����@���L�`��`��3�$�3��`����`1ȉƉ�����3�$�@���L�`��`��3��`��3�$���`1ʉщ�����ɋt�`��`��3��`��3�$���`1�Ɖ�����@���L�`��`��3��`��3�$���`�G�1щO�$�A��3�$`1Љ‰������ҋt�`��$d��`��3��`��$�1�D1ɉ�����`��1щʉ�����ҋt�`��`��3��`��3�$h��`3�$l��1‰Љ�������t�`��`��3��`��3�$p��`��1ȉƉ�����@���L�`��`��3��`��3�$t��`1ʉ։����@���L�`��`��3��`��3�$x��`1ȉƉ�����@���L�`��`��3��`����`3�$|1ʉ։����@���L�`��`��3��`��3�$���`1ȉƉ�����@���L�`��`��3��`����`3�$�1ʉ։����@���L�`��`��3��`��3�$���`1ȉƉ�����@���L�`��`��3��`����`1ʉщ������D�L�`D��`��3�$�D3��`��3�$�D��`D1ȉ�������ɋt�`��`��3��`��3�$���`1�щ������D�T�`D��`��D3��`��3�$�D��`D1Љ��������D�T�`D��`��D3��`�ȋ��`D�1�щ������D�T�`D��`3�$���A����D3��`D��`D��D1ȉƉ�����D�L�`��$���D��`��1���D3��`3�$����`�G�D�1�ʉO�L9������H�t$HL��HH��L�V@I��L��f��PH1�PL1PH��I9�u��$D��$���$�E1�H��1�I��D���f�D��$���$�3�$`H��A�É���A����E�ۋ|�`B��`D��3��`B��`3�$d1�3�$hA�Ӊ���A����E�ۋ|�`B��`D��3��`B��`3�$l1�A������A������E�ۋD�`B��`D��3��`B��`3�$p1�A�É���A����E�ۋT�`B��`D��3��`B��`1�A�Ӊ���A����E�ۋ|�`B��`D��3��`3�$tB��`1�3�$xA�É���A����E�ۋ|�`B��`D��3��`B��`1�A�Ӊ���A����E�ۋ|�`B��`D��3��`3�$|B��`1�3�$�A�É���A����E�ۋ|�`B��`D��3��`B��`3�$�1�A�Ӊ���A����E�ۋ|�`B��`D��3��`B��`1�3�$�A�É���A����E�ۋ|�`B��`D��3��`B��`3�$�1�A�Ӊ���A����E�ۋ|�`B��`D��3��`B��`3�$�1�A�É���A����E�ۋ|�`B��`D��3��`B��`1�A�Ӊ���A����E�ۋ|�`B��`D��3��`3�$�B��`1�A�É���A����E�ۋ|�`B��`D��3��`3�$�B��`1�3�$�A�Ӊ���A����E�ۋ|�`B��`D��3��`B��`1�A�É���A����E�ۋ|�`B��`D��3��`1�B��`�C�1�D1�S�L9��'���A��L��H��H��3�$`H���lj����@���T�`��`��3��`��3�$h��`3�$dD1�A�Ӊ���A����E�ۋ|�`B��`D��3��`B��`3�$l1�A�É���A����E�ۋ|�`B��`A����3��`��`3�$pD1߉�A����A����F�\�`D��`����D3��`@��D��`D��1�A�Ӊ���A����E�ۋD�`B��`D��3��`3�$tB��`1�3�$xA�É���A����E�ۋ|�`B��`D��3��`B��`1�A�Ӊ���A����E�ۋ|�`B��`D��3��`3�$|B��`1�3�$�A�É���A����E�ۋ|�`B��`D��3��`B��`3�$�1�A�Ӊ���A����E�ۋ|�`B��`D��3��`B��`1�3�$���A���A��@��F�\�`D��`��D3��`��3�$�D��`D1�A�Ӊ���A����E�ۋ|�`B��`D��3��`B��`3�$�1���A���A��@��F�\�`D��`��D3��`��D��`D1�A�Ӊ���A����E�ۋ|�`B��`D��3��`3�$�B��`1���A���A��@��F�\�`D��`��D3��`��3�$�D��`3�$�D1�A�Ӊ���A����E�ۋ|�`B��`D��3��`B��`3�$�1���A���A��@��F�\�`D��`��D3��`��3�$�D��`�C�A1�D�[�H9��"����<$H��tlD��$���$�H��$���$�D1�1�1�1�H��I9�u�D3�$�3�$��$D��$���$����A���l�����$�L�D$X�BnaeD��$`D��$d�$��$�D��$h��$l�D$��$���$pD��$t�D$��$�D��$xD��$|�D$ ��$�D��$���$��D$$��$��D$(��$��D$,��$��D$0H�vH�D$P�hprO�@�t$4D1��A���A����F�|�`D��`��D3��`��D1�D��`D��D1�1�A�׉���A����E���L�`B��`D��3��`1�B��`1�A�lj���A����E���L�`B��`D��3��`1�B��`1�A�׉���A����E���L�`B��`D��3��`B��`1�A�ω���A����E���D�`B��`D��3��`D1�B��`D1�1�A�lj���A����E���T�`B��`D��3��`D1�B��`1�A�׉���A����E���L�`B��`D��3��`D1�B��`1�A�lj���A����E���L�`B��`D��3��`1�B��`1�A�׉���A����E���L�`B��`D��3��`B��`1�A�lj���A����3$E���L�`B��`D��3��`B��`3D$1�A�׉���A����E���L�`B��`D��3��`B��`3T$1�A�lj���A����E���L�`B��`D��3��`B��`3D$ 1�A�׉���A����E���L�`B��`D��3��`B��`1�A�lj���A����E���L�`B��`D��3��`3T$$B��`1�A�׉���A����E���L�`B��`D��3��`3D$(B��`1�3T$,A�lj���A����E���L�`B��`D��3��`B��`3D$01уl$4�x���H�t$XH�D$P���H��H�D$P���H�t$XH�5�H9�t
H�Ƌ�N�.���H�t$8H�\$@H��H�L$H�oH���H�FH��)$H�C�F�C�FH�5F��� H�����0��C��H�{�H������C<H���i�ff.����~+�*0�Ff�1��?*t���0u��F1�D������f.�AWAVAUA��ATI�ԉ�UH��SH��L��H��H�����u��L��H��D��A�H���/�H���7p��fo�
�uDŽ$xrstuI�Ƌf��$|)�$`�D$H�jklmnopqH��$pH��t�C��$bL��$~foT
H�UUUUUUUUL��$`L��A�L��L�$H��$��=�UUH�=%��$~�$��$�DŽ$�UUUUf��$�Ƅ$��Q�L�$L9�txH�T$pH�t$ �H�=���H��$H��$��H�=������D$D��L��H��1�A��t��A�H���H��[]A\A]A^A_�f�H�H�HH3�$`H3�$hH	��h���I�OH9H�Z���A�9x�M���A�@8x�>�����$bH�w�!��H��I�WCH��$�H3QH3H	�����I�GKI�WSH3AH3QH	����A fA9G[���H�D$p�H�=��H��I��H�D$ H��H�D$���H��$L��$��H��L��H�=��H�$L�D$���T$pL�D$H�D$�с����Y�ۉL$p�������$543������HL��H���t�����x���H�4$�HL����s�����_����D$A��q���ff.�@SH������A����H�F�I��H��
v	H�����?$���2���G<at<y�H����H���������H��H��H��H���J0H�H)�H��0�$2L��L�D$fA��WI�xA�@A�P�A�@$A�HA�@$���L�D$A�@H��L��[�A���l���H��1�[��E���"��@�5�0�r���A�A��~ܻ�SH��H���p�������=T�!����l��H��H�@���H�PH�(�!H9���H�!H9���H��H��H)�H�
��!H���!��ʉH��H�� �SH��H��(�SH��H��8H��0���S�֔!���C�ЈS	����?�Ȁ�C���!�C
���!f�CH��[�DH���!H��H�v�!H�낐H�|$��y����uE�D$f�����H�=U�!�W�!�y���
C�!��fDH��1��!���fD�k��H��H�� 1��Eq���z�����f.����AЃ�0~�Q����w�NЃ�0~'�F�	��D�����~��w�Q���NЃ�0ى�	ȃ�~�F�	��ff.�f�H���F�N�P�FP�F
P�FP�FP�F
P�F	P�FP�FP�FP�FP�FPD�N1�D�FH�5���w��H��h�ff.��UH��SH��H���z��A�!�H�81��f�I��s H��H��$t(��DOu�-uH��vڸ}H��[]�fD�{$�}u�H��H�����H�{�E����H�{�E����H�{�E����H�{	�E����H�{�E����H�{�E��y���H�{�E��m���H�{�E��a���H�{�E��U���L�C"H���E�f.�L��H���4���I���EL9�u�H��1�[]�f.�DH�%�!1��f�H�=	�!�p��@H�=��!�y��@UH��H�=�!SH���Kh������H���i��H��H����H9�u
�DH��H���i��H����H9��„�u�H���
q��H���5q��H��1�H�=y�!H���!��v��H�
�!H��1�H�:������m��H�=��!��j��H����[]�fD�H�=4�!H���!��q��H���8q����u�1�H����[]�f�H���c����AVAUATI��UH��SH��`��v���Å�tH��`��[]A\A]A^�@H�=ɐ!H�����H���jw��I�$H��t�f��H��`��[]A\A]A^�DH�=��!H�\$L�l$0��r��H��H�� I��H��1��6p��H��"L��H��1��p��H��H�t$M��L��1��xr���Å�t=��v���H�D$H��L��1�I�$�Ao��I�$H�=�!H�����H���g��I�$H�@H���5���L�����+���ff.��AUATI��UH��H��H��SH��H��H��A�T$8H�3A��H��tI�T$@H�
8�!H���@k��H��D��[]A\A]�f�UH��H��SH��H��H��H�U@�ui��H�E@H��H��[]��fDH���H����@H��H�����H���ff.�@H�G(H�����H��ff.��H�GH�����H��H�G H��H���I��H�G0H��H��L���ff.�I��H�GHH��H��L���ff.�I��H�GPH��H��L��L��E����H�GXH�����H�G`H�����I��H�GhH��H��L��D����ff.�H��H�Gp��H���f�H��H�����H���ff.�@H��H�Gx��H���f�AUM��ATI��UH��H��L��SH��H��H���SI�$H��teH��H��H���f����t=�uH��1�[]A\A]��I�4$M��t��H����d��I�4$I�EH���Es��H���.N[]A\A]�DH���.N[]A\A]�E1��l���I��H���H��H��L���ff.�AWAVAUATUSH��HH���H�t$H�T$ L�D$(L�L$0H�$H���2�I��I�΄��9H��1��f�D��L����t6D�mL�}<%u��s��A��H��DP�D���L����u�DLc�J�,�L���=f��H�<$H�D$�/f��H�T$H��I��L�|$L��H�DH��H�D$��h��L��H��I���h��H��1�M��H���*h���\$H�$A�����1�\$<� fDA�L��I��I���C����<%u���r��A�NH�H��DH��H�$HcŃ�dH����w<H�=m��Hc�H���f�D��A��%�����EL�}���fD�I�^�����
L��H�t$��L��L)�I��$���L�sH)�1��#k��H�I��C���D���f��\$<A�L��A��t$0�t$D�L$ H�L$8H�t$0H�|$A��$�ZYH��H[]A\A]A^A_�D�����p����D$�f���f�I�^I�GA�%��%tH��I��L��I�����fDI��I�����@�I�^����f���������A�F<h�G<u�_<d�����I����A�F<f�F~O<l�K<u������I���p���f�A�~D�u���A�F��a<�e���H�5���Hc�H��<d�J����I���)���H��H��[]A\A]A^A_�@1�E1�1������I�����I������I�������I�������I������I������I��I�^�K����I�����I���z���A�F<dtU<u�{����I���Z����I���K����I���<���A�F<dt&<u�=����
I�������I���
����	I�����I��H���H��H��L��L��L�D$��I��H���H��H��L��L��E��L�L$��H���I��H��H��L�L$HH��L����t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$��D$(L�D$H�D$H�D$ �D$0H�D$A���H����ff.�@I��H���H��H��H��L��E�Ȅ�t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$��D$0L�L$H�D$H�D$ �D$0H�D$A���H���ÐI��H���H��H��L��L��M���DI��H���H��H��L��L��E��L�L$��H���I��H��H��L�L$HH��L����t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$��D$(L�D$H�D$H�D$ �D$0H�D$A���H����ff.�@I��H���H��H��H��L��E�Ȅ�t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$��D$0L�L$H�D$H�D$ �D$0H�D$A���H���ÐI��H����։�L��L����f.�AUATUH��SH��H�5�H��H�H���[����u&H��y!H�EE1�H��D��[]A\A]�f.�H�5��H���a[����u
H��y!H�E��D�+A��E��t�H�{H�5z��1[����u�A���A��St�뙐AVM��AUE��ATA��UH��SH��H��H�D$H�|$�2�����uH�D$M��D��D��H��H��PH��[]A\A]A^�f.�M��A�ȉ�H��H�5���f��f�H�G �`f�H�G �`f�H�G �` f�H�G �`(f�H�G �`0f�H�G �`8f�H�G �`@f�H�G �`Hf�SH��H��t�G�H�wH��tH��H���N\��H��[�f�H���[��AUM��ATI��UH��SH��H��(H�|$������uL�D$�D$L��L��H��H��A�PP�D$H��([]A\A]�@I��H��H��H�5��kb��ff.����������%���8	�	����ff.�@AU1�I��H�z�ATI��1�UH��SH��H����f��H��H��1�I�EH�T�1��f��I�$H��[]A\A]ÐUH��SH��H��H�H���b��H�$H�EHcD$H�E1��CH�CH��[]�ff.�@UH��SH��H��(H�H�t$��[��H�T$�D$H�UHcT$H�U�C��uH�CH��([]�f.�H�;H�T$H�5��1��
b��H�C�D$H��([]�ff.�H��H��H���H��H���(g��1҅�u
1�H�<$�‰�H��ÐUH��H�͉�SH��H��H��(H�H�t$��f��H�T$�D$H�UHcT$H�U�C��uH�CH��([]�f�H�;H�T$H�5�1��Za��H�C�D$H��([]�ff.�SH����H��H��d���D$�C��uH�CH��[�@H�;H�T$H�5��1��`��H�C�D$H��[�ff.��SH����A�E��H��H��[���D$�C��uH�CH��[�H�;H�T$H�5�1��`��H�C�D$H��[�@H��d���AT��US�H��H���vH����[]A\�f�H��H��H�|$M�ċ��e���Å�u�L��(�\��H��t!f�@H�EH�P H�T$L� H�PH����[]A\�f�SH��H��Cu"�m^��H�{�d^��H���U��1�[���_��H�{��DAUE��ATI��UH��1�SH��H��H�T$H�T$�Z����tU=~uA��uH��[]A\A]�DH�}��H�EH�D�H��1�H)��+���H�H��[]A\A]�@1�H��H��L����U����u�H��[]A\A]ÐAWLc�AVI��AUI��ATUSH���L$E���1�H��`H� H�$��E1�1���f.�M��XH��H��H��?H��?H��4H��=HÁ�H)�H�DA��`��H)������D��A�W��H�L������H�lhI9n ��Lc�H��H�]L���HI�H��H��LI�I��M��M;�X�e���L��I�~H�4$�H��A��O������7���H���J��I!�I�n(I�F01�M9nPuH����[]A\A]A^A_��I�nXL��I�~D�D$H��
�H������Å�u�H���a����t%M�nP��Hc�H�&�H��I!��D�눐ATL�fXUH��SH���$H�C8�C@�H��H�pH�s8� �����u#�C@L��p�s@�;\��H��H�EH�UH��t�1�[]A\�@UH��
H��1�SH��H��H�?H�T$H�T$�lW����tH��[]ÐH�;H��1ɺ�~W��H��[]��AWH�GAVAUI��ATL�gXUSH��H��HH�$H�D$8L�t$@�T$�D$
H�D$f�H�C0L��L��H�P�Z��H�S0H�BL!�H	�H��L����H�SPH�<$L���3���A�Dž��"I�H�{`L��H�kPH��L��I�$H)�H��$8H)΁�H��P���H�L�K(H�{M��I�iM���II�H��M��MI�I��M��L�T$I��L;�XtEH��`�L��L�L$(A�L�\$ ����A�Dž�uL�T$H�{L�L$(L�\$ L��XH��H��?H��4HŁ�H)�L��H��?H��=I���H)�����+`H�C I9�|
H�H�C H�T$1�L�\$8�U��A�Dž�tH��HD��[]A\A]A^A_ÐH�{H��`1ɺ�U��A�Dž�űt$L���W����u�H�C0H�s(1�H�<$H�PL����H	�H�SPH�LqH�C0L��H�K(���A�Dž�u��l$����A��k����H�<$L���d���A�Dž��k����N���@AW1�A��H���AVAUI��L��ATA��1�UL��SH��H����]��H��1�H��H�~�I��1���]����hI�EH�D$�W��H��H�@P����H�(A��u�HA��t�KA����A��!L��H�{I��D��D���6\��A�ƅ�tWH�{H�CH��tH��tH���Z��H�{H��t�X��H�CH��tH���W��H���O��H��D��[]A\A]A^A_�@H�t$H�{I��D��D���[��A�ƅ�u��s�H�߃�D���P��A�ƅ��j����CtH���Z����u'H�
�m!H�����H��H���T��I�]�w���DA���)����H��H�?H�����^]��ff.���AVA��H��AU��ATA�USugH��tbI���I��I��H���LP���Å�t��[]A\A]A^�D��L���]\���1�H��H���+����Å�t%H���MY����[]A\A]A^�f����[]A\A]A^�H�}XL��L���^��I�I�V���ATI��UH��S�O���Å�t��[]A\����1�H������Å�tH����X����[]A\��H�E8H��L���E@��������f.�ATI��UH��S�<O���Å�uL��H�����H����aX����[]A\�f.��G���f���AV��H��AU��AT�USuiH��tdI��I��H���X����uR�H����N���Å�uDD��L����Z���1�H��H������Å�t,H����W����[]A\A]A^�f����[]A\A]A^�L�uXL��L��.NL���O����t�H�UPH�}L���e�����륐��A��H����A��H���AWAVE��AUM��ATI��UH��SH��H��(H�L$�W������F�|-A������H����M���…�����L����Y��1ҹH��H��H�D$����…�uYH�CXH�D$A����A����D��H�{X�zR����tvH�L$L�sXM��L��H��L���O��H�SPH�{L���l�����H�߉T$�~V���T$�
��H��(��[]A\A]A^A_�f.������H�t$D��H���`����…��p����@H��L��H�{X�R������>����u����L��H��H���JN������D1���~�VH�
`���Hc���H����1�H�H�wH�Hi�?H�H�~H�Hi�?H�L�GH�Hi�?I�I�pH�Hi�?H�H�~H�Hi�?H�H�H�ȃ�t�Hi�?H��H�H��H�Hi�?H�H��H�Hi�?�c���f�1���@1��@H��1��f�I��1��f���fD1��G���f�H��1��"���fD1��w���f�AT��U���S��H�Ā��w�G�u	�t��t	��`1�H�쀉�[]A\�f�H��H�A���Q���Ņ�u�H�SH���L���Ņ�uDH�D$81�H�CP����H����H����`H��H�C H��XA��t A��u��K�@H�{�R���u���f��K�j�����O��t(��`�P�1���`��~�f����OH��qR�����f.�AWAVAUATUSH����~}��Lc�H�T$I����M���H�l6�f�A�D]H��H9�tAI�T]A��)�H��D9�u�H�|$L�L���.O����u�H��D��[]A\A]A^A_��E1���ff.�H����~�O�T	��)�9������ff.�f�AVAUI��ATM��UH��SL�7�fE��~B�w)�Hc�Hc�H��KP��I�FIc�L��f�\ED)�L�4Hc�H��*P��fB�\5[f�E]A\A]A^�fDI���7��tFSH��L��H�������t#H�H�PH�S�TS�H��)�H�[�f�H��e![H�H�R�H��e!H�H�RÐD�fE��~&H��H��H��A���C�������H�����fD1��ff.�f��f��t0�L6�9�|(Hc��H�4��~�T7�H�GH��H�)��@H�e!H�H�R�f�AWAVAUATUSH��H�/�����H��H���H�����A��1�E�����E�I��D9��~Mc�A����J�|{�H�|$I�GB�c���CL�,D)�L���)�L��Hc�L��H)�H)�H�H��6R���L$J�D+�H�tkD)�@�PH���f�P�H9�u�D�#A���fD�#H��[]A\A]A^A_�DH�D$��f���DAW��I��AVH��AUI��ATL��USH��8L�t$0L���H�I�}I�EIDž�H��H��L��H)������H�I�xL��I�Iǀ�H��H)������H��D$0f������H�T$(M�~I�������L�l$I�D�L�D$ A�H�D$�I�I�OL!�A)�M�,H��H��)�L�D��L��H	�H�L$D�D$�ZR��D�D$H�D$(L��H�|$HE|$ L!�I��L	�H�L$I��H���HH��E�G�L;|$u�H��8[]A\A]A^A_�f.��1�f��w~��f��tq�OH�Gf��w`�Wf��xW��f9�O��~0�ED�f��x8��9�1�Hf��x(D��A9�f9�|D�ǃ�H����̸�fD1��DH��H�
��fDH���P��<?v�H)������H�H�H9�w
H��H���D@�PH�
���H�5��H�=���tH��@UI��H�%�SH��I��A�A��<?v�I)񸤪��I�I�H9��I�AH���@H����I��I��M��I��I�[L����I��H���
�,��N��
��	�A�H��N��
�����N��
��	�A�H��N��n��
��
*A�H�L9�u�H�[I��H�K��H��vGA�2�42D��A�r�42@��D	�@�7H��uA�rE�B�42B�����	�W��H����[])���I���H�
T���H�5��H�=���G��ff.��SH���I��Hc��[�ff.������_w���������������PH�
����H�5�H�=W��F��f�S�����_�,D�Z�I��E1�E����H��E1�L�
���I��A��H������?A�A�@��A��Y�������0��	�H�A�A�@��A��Y�������<��	�H�A�A�@��A���?A�A�@�E9�|�D9�~eMc�H�
\���N�A�����?�A�D9�tOJ�tA��������0��	�H��A�@�����<�A�@A�@=I��I�@A�[H)��@A�A�@=����0�A�@��H�
P���H�5��H�=���XE����@��f.���G +F �f�UH��SH��H��H�=�i!H��t�K��H�(H�XH��[]�DH�^!��H�8�'?��H��H��i!��ff.�AWAVAUATUSH��hH��i!H����D�@E���H�D$(H�=�]!H�|$0H�|$XH�|$8H�T$(1�H��HPH�BH�:1�H�D$@H�H�|$HH�|$8H��H�D$ H�D$0H�0�A��LccH�D$XL�{L��H��H�D$L��H��L�<$�E���(L��L��H�
���H���@��E����E�M��I��I��H�D$H��H�l$I��H�| H�\$L��H�|$I��f�A�GL��H��I�� �D��L��1�H���D��I�_�H��(I�G�I�G�M9�u�H�$H�\$L�`H��H�$H�D$f�I�$H����L�9M����L�qH�l$1���H�CH��(H;\$t^H��H�}L����E����u�A�EH��I�MH$��~)H;t2H�Q�p�H�4���H��H9Z�tH9�u�HcЃ�H��A�EI��M�~�M���r���I�L$H����L�9M����L�q@H�l$1���H�CH��(H;\$t]H��H�}L���E����u�H��H$�CH�K��~*L;)t2H�Q�p�H�4��f�H��L9j�tH9�u�HcЃ�L�,щCI��M�~�M���s���I��(I�� L;l$�����H�$H�D$ �p���k�F�E1�E1�H��H�<�H��L�L(1�1��f�9��Hc���H��H�H�xu�D�`E��t[H�@H���H��H9���L�M��t�H��1�fDI9�t���H�� 9�u�H�
i���H�5��H�=��1A���H���/H�BH�@H�KH�QL�H;��H��L9�u�H�� I9�u�A��H��D9��(���H�@H�D$ �(�pH�D$0H�8�;��H��Y!H�ŋ;����H�t$H1�H�=����?��M���WH�D$ �H����L�t$ �@M�mA��M���+E9f�xH����F��I�U�o�oJHH�R H�P ���t�H�pH�=6�1��a?�����)H�� H�I9��������@I������H�
	���H�5��H�=����?���H��X!��H�8�9��D�@H��d!E�������H��h[]A\A]A^A_�@H�
����H�5=�H�=F��q?��H�D$0�(H�8�9��H��X!H�ŋ��t-H�t$HH�=+�1��|>���3��tH��W!�
H�0�@��H�|$X�E��H�D$@H�D$(H�|$(H�(H��c!9x�o����M���M���T�����H�
���H�5��H�=����>��fDH��c!H��tX�P��~0H�H��H��H�AH�Lf�H�H��H�H9�u�H�Jc!H�7c!H�$c!�ff.�AT1�UH��H��H�=D�SH���u=��L�%�V!H��t_I�$��H�=&��oG��H�}H��t.I�4$H���)>��H�}tI�4$�,�D?��H�}��fDI�4$�)�*?��I�4$H��tcH��H�=�����G��H�;H��t0I�4$H����=��H�;tI�4$�,��>��H�;��f.�I�4$�)��>��I�4$[�
]A\�>��USH��H�-b!H��t.H���v;��H��H��H���hH��H��tH�H��[]�f�H��1�[]��AWAVI��AUE��ATI��UH��SH��H���^<��I��H��tfL���^C��H��U!L�0H�H�hL�`D�h H�PH��U!���uH��[]A\A]A^A_�DH��L��H��H��[]A\A]A^A_�d>��@L�=qU!�(�I�?�6��H�=a!I��tRI�?�L�D$�8=��L�D$H��I��L��e:��H�=�`!L��H��H���@8��L��H���C��L�D$�%���I�?H�D$�@��L�D$H��`!�ff.�f�USH��H�-�`!H��tH���9��H��H��H��[H��]��F��f�H��1�[]��ATI��UH��SH�G`!H��t"H���9��L��H��H��H��[]A\�7��DH�YT!H�8�y?��H��H�`!��f.�UH��SH���"?���E����tH����[]�fDH�t$I��H�
+�1�H�0��A���Å�uH�D$H��_!�D5��H����[]�ff.�SH��H��H��_!H��tH�H��H��[���H�t$�^�����uH�c_!H�t$H��H�H��[��H�������[�fDSH��H�� H�1_!H��tH�@H�� H��[��fDL�L$D�D$�L$H�T$H�4$�����u,H��^!L�L$H��D�D$�L$H�T$H�4$H�@H�� [��H�� �����[ÐSH��H�� H��^!H��tH�@H�� H��[��fDH�L$�T$H�t$�u�����u#H�z^!H�L$H�ߋT$H�t$H�@H�� [��H�� �����[�H�I^!H��t�`������ff.�SH��H�� H�!^!H��tH�@ H�� H��[��fDL�D$H�L$�T$H�4$�����u'H��]!L�D$H��H�L$�T$H�4$H�@ H�� [��H�� �����[�ff.�SH��H�� H��]!H��tH�@(H�� H��[��fDL�D$H�L$�T$H�4$�a�����u'H�f]!L�D$H��H�L$�T$H�4$H�@(H�� [��H�� �����[�ff.�H�)]!SH��H��tH��H�@0[��fD�����uH�]!H��[H�@0��fD�.N[�f�SH��H�� H��\!H��tH�@8H�� H��[��fDH�L$H�T$H�t$�����u(H��\!H�L$H��H�T$H�t$H�@8H�� [��@H�� �.N[�ff.�f�H�Y\!H��t�`@��.N�f.������H���H���H�r�AI��H�yH��th<%u��O��ti�AЃ�	v�q��AɃ�W��G���H�O��w@��t@�~Ѓ�	vD�F��~Ƀ�WA��G��H�r��AI��H�yH��u�A���I��A��I����H����U1�H��SH��H���?<u	H����H�ߺH�5���5;��H�SH�5����HDںH���;����tc�H�5��H���:����t3�H�5��H����:����uSH�
��H�CH�MH��[]�DH�
j�H�CH�MH��[]�f�H�
D�H�CH�MH��[]�f.�H��1�[]��1��ff.�f�AWAVAUATUH��SH��(�Z9��H�����0H��@����I��A�L�-��f�L���4��A�V��H��tA�NA��I��A�4$@��u�Hc�L�$�L��H���26��L��1�L�d$H���5��L��H�5��H��H�D$I���F?��H��t|�L�=s��L��L��1�Lc�� ?��H��H��t7H��H���8��I�D�H��u�H�D$H�D$H��([]A\A]A^A_�DK�D�H���f�A��H���H�D$��ff.�H��t+H��H�T$H�t$���H����H�����f.�1��ff.�f�H��tKH��H�T$H�t$�h���H��t+H�t$�H�=k��������H�����fD1�H��Ð1��ff.�f�H��tKH��H�T$H�t$����H��t+H�t$�H�=��������H�����fD1�H��Ð1��ff.�f�AWAVI��AUI��ATI��UH���SH��(H�D$�C4��f�H��H�@I�EH����M����I�H�T$H�t$H���R���H����H��L���6��I��H�����D$��tL���1��I�D��8>�|��PL���3��f�L��@0H��@H�@ �@�H�@(H�@8�@0����H�t$@@�+6��H�EH���lH�5��H���,�������/L��E1��g1��H��t�L�xA�}[��:L���1��I��M���?I�AH��H�D$���A�y��H�|$1��
�5��L��E�o���1�A�}[L��@��L��y5��H�EH����M���H�|$�?��0��H��t�x?tiI�.H��(1�[]A\A]A^A_�D�CH�"�H��.NH��([]A\A]A^A_��E|���@H����CH��.N�ƀx�L�HL�����L��L���4��H�E H���i���H�+��CH�H��(�.N[]A\A]A^A_�DL���`���1�A�}[L��@��L��j4��H�EH��t�M�������?L��E1��/��H��t�L�hA�?��L���
���L��L���4��H�E H���`���M��������?L���l/��H��H�����A�}L�x��M��������?L��H�T$�3/��H�T$H������zL�h��M���R����?L���.��H�����A�}L�x��M���!����?L����.��H����H����CH��.N����f�H�i��CH�H��(�.N[]A\A]A^A_�H����CH�H��(�.N[]A\A]A^A_��]L���C.��H����H�x�:�.��I������H�5��L���2��H�E �}����L��L������H�E@H����H�8E1�H����f��;���H�E@J��:!u�EHI��J�<H��u������z����E1�L�����H�5��L���(�����$H�5��L����(�����
H�5��L����(�����wH�5��L���(����tH�5��L���(�����Y�E0���A�}�L���E1�L���j���A�}��L��L���t1��H�E8H�������f�A�}����L���-���L��L������H�E(H�����H�&��CH��.N����f.�L��H�D$���L��L�����H�T$H��H�E(�����@�E0�0���@H�5��L���0��H�E ����H�y��CH��.N�{���H����C	H��.N�`���H�3��C
H��.N�E����E0���H�|��E0����H��.N�C�����SH���&����uH��z0�tH�JH��t
�9uH�B[�f�H�J�B0H��u���f.�@SH��1ҹH��H�w(H�0H�D$�+/����tH��[ÐH�{0H�3H�T$�/.����u�H�D$H�H�C�H�{0��1��H��[�ff.��SH�[�H���H��0H� H�L$H�t$H�D$H�D$H�G�H�D$ H�D$(��4��H�{ �0��H�{��1��H��01�[�ff.��ATI��UH��SH���m&���
H�t$H���H���R.��1�H��x���u%H�L$H9�t�1@�� t(@��
tH����[]A\ÐH��1�[��]A\��y
u�I�$�H��[��]A\�fDATUSH�H��H�x�
&��L�#H��H��I�|$�-��H��I�D$(L�#I�|$�-��H��I�D$0H�H�x �1)��H�H�R(H�JH�H�JH�HH�JH�H�B[]A\�ff.�ATUSH���D7�H�5��H�\$H���O4��1�H��H�5��H���;4��H��tI��H��uH��1�[]A\�H��
1��-��L��
1�H���,��Hc�H��Hi�@BH�H�[]A\��AUI��ATI��H��US1�H��8I�$H�|$�8/��1�1҃��&����tH��8[]A\A]ÐH�t$1�1�H�|$ �&������H�|$�@�6*��L�D$1ɉ�H�źL�@H�D$ H�} H�E�,����uHH�}��)��I�4$1�L�e8H�EA�L$H�|$(H�E�>/��L�ME1����G/����t#H�|$�D$�U/���D$H��8[]A\A]�fDH�} �@B��,����u�H�} H�t$(�0(����u�H�} H������,����u�I�mH��8[]A\A]�f��W�f;WsH�G�ʃ�H�4�1�f�W�F�DAW�AVAUA��ATUSH��X��DD��Ff����I��H�t$ 1�1�L�t$(H�t$��@I� �O*��H��I+G(H=@KL��I�o(I�L���|2������L�����H�L$H�t$0H�F�H�D$0H�M��H�D$@H�D$(H�D$8H�D$HH�x ��0������H�|$(�#���H�t$(�D$H�~H�t$�$��I�H�t$�#���T$��tVfDI� ���2��A�D$��9�vX��1�B�+��I�D$��L�<�A�G��t;H���������"��H�����DA�GI� �?2��A�L$f�9�t4H��XL��[]A\A]A^A_�f.�I�H�t$(�""���]���DE1���H�O0H��H��t��H�(H���f���H��1��$��@AVAUATUS�Gf��t:H�_��A��I��L�l�DH�+L��H�}�(����ufD9utH��L9�u�1�[H��]A\A]A^���F��t�F1��ff.�@SH�~ H���#(���C�!��H�{ H�C(�1��1�[�fDAWAVAUATM��U��S��H��(H�|$x�T$H�t$�L�|$`L�l$hH�L$1�L�D$L�t$p�h!������H�\$I�|$�"��H�{L���!��A�}��~A@I�L�$(M��t$L���,#��L��L��H���0���8u�L$���H�� A;]|�H��([]A\A]A^A_�@H�D$L��H�x�O ����u�H�t$H�|$�, ���r����AWH��A��1�AVI��H��AUE��ATE��U��1�SH��(H�|$�!��H�|$�0�A%��H�|$L��H��H�x��'��fD�{1�H�{ H�H�T$�C�.����tH��([]A\A]A^A_�H��H�=���D���t$ H�{L�
9���D��SPD��$����H�� ��u�H�{��D$�+��H�T$h�D$H�H��([]A\A]A^A_�f�AVI��AUA���8ATI��US�u$��A��L��H��L�`H��fD�h1�f�C�S$��H�C H�C1�H�CH�C0H�C(I�[]A\A]A^ÐH��t;�����1�L�
��1�A��2�O��A��H��E3�D��H9�r���fD1��ff.�f�H����-��H����%��f.�H�G H��tH���1��y!��f�AWAVAUM��ATUH��H��SH��H����$�H�4$H�T$L�D$�D$� ��H��H��H��I���$%��H����'��H����L�|$ H�xI��L����,����t)L��H��$����$H�Ĉ��[]A\A]A^A_�@L���8���H�$H�D$ M��D��$��H�\$@H���H�L$0H�L$H�81�L�d$HH�L$8�L$�&��H�T$ H�t$0H�H�
H�z H�D$X�H�D$L�l$hH�L$PH�L$(H�D$`H�1�H�D$pH�D$x�*���…�uZH�|$ � ����…�uJH�\$ �	H�=��H�H����€��҅�uLH�{�$���I�~H������$���@I�~H�t$ �$���L��H���t���$����@H�ƹ
H�=���������ҁ�����.N�@����ff.�AWAVAUATUH��H��SH��H��hH�t$�L$L�D$���H��H��H��I���%#��H����%��H���rL�t$ H�xI��L����*��A�Dž�t'L��H�����H��hD��[]A\A]A^A_�f.�L���8���H�D$�L$H����H�\$@H�D$0H�D$ H�D$8H�81�L�d$H�$��H�T$ H�t$0H�H�
H�z �H�D$XH�L$PH�L$(��(��A�Dž�uYH�|$ �O�A�Dž�uHH�\$ �H�5;�L�L�������uFA�.NH�{���I�}H���������fDI�}H�t$ ����L��H��������f��	H�5޿L�������t6L�t$M��t��
1�L���
"��H�\$ A��A����DA��e���DH��E��AQI��H��H�5��API�к���H���DH��E��AQI��H��H�5M�API�к���H���DH��E��AQI��H��H�5"�API�к���H���DAWAVAUATI��UH��H��SH��H�t$H�L$L�D$L�$���L��H��H��I��� ��H����C#��H����L�t$(H�xH��L���v(��A�Dž�t'H��H���4��H�ĈD��[]A\A]A^A_��L����H�L$0H�t$P�H���L�d$`H�D$PH��H�D$pH�D$(H�D$XH�x L�l$hH�D$x�&��A�Dž�uxH�|$(���A�Dž�ugL�d$(�H�5��M�$L�������td�H�5�L��A��������I�|$�6��H�{L���:������DH�{H�t$(�B��H��H���'�����f�L�d$8L��H�5�H�D$@L���&��L��H�5Ͼ1��&��L��H�5��1��~&��L�4$M��t�
1�H���f��fA�1�L��H�5���Q&��H��tL�d$@H��L�����u8H�{H�t$(���H��H��A�.N�y���@���@A��1���DH�D$@H�T$HH�pH�D$(H�x(����A�Dž������H�D$(H�t$HH�x(�#��H�L$H�t$L��I��H�D$(H�x(���A�Dž���H�D$(H�x(�_��A�Dž�uxH�D$(H�L$L�h(H�D$@H�P�H�H�T$H��D�H�|$(��A�Dž��l���L�d$(�H�5�I�<$��€�D��E���"���f�H�{L�����@H�{H�t$(�r���)���ff.�f�AWAVAUI��H��ATI��USH��X�T$����L��L��H��I���_��L������H���\L�|$H�xH��L���(%���Å�t"H��L������H��X��[]A\A]A^A_�fDL���x�H�-��L$H��H�D$ H�D$�H�D$(H�81�L�d$0L�t$8�J��H�T$H�t$ H�H�
H�z �H�D$HH�L$@H�L$�.#���Å�uXH�|$���Å�uHL�d$�H�5��I�$H����À��ۅ�uAI�|$���H�}L���������fDH�}H�t$���H��L���������f�H�ǹ	H�5��������ہ�Q���.N�@����fDI�ȉ�H��H�5
��l���ff.��I�ȉ�H��H�5��L���ff.��AVI��AUI��ATUH��SH��0H�I��L���l#���Å�tH��0��[]A\A]A^��L�����H�L$H�t$�H�D$H��H�D$H��H�D$ H�$H�D$(H�x �!���Å�udH�<$���Å�uUL�$$�H�55�I�$H����À��ۅ�tO�.NI�|$�h��H�}L���l��H��0��[]A\A]A^�DH�}H�4$�k��H��0��[]A\A]A^�@I�T$H�pL��H��	�S��L�$$I�E�f�AVAUI��ATI��H��UH��S���H�}I��tUL��(�P��f�L��L��H��H�@ �@����H�}H��L��H�CH��[]A\A]A^�;��L���0��H�E�f.�AWI��AVI��AUATUSH���H�|$ H��H�t$0H�T$pH�L$(���L���\����L��L��H�D$���H���\H��HcÉ\$8L�=U�H��L�l$ H�D$HH��$�H�D$H��$�H�D$�[D�HH�pL�øL�C�Q���Hc�H��H�<L�H�GH�|H�T L�L�gL�:H�B�HH����H�L$1�1�H���A��H��$�H�����L�sH��L�����L��L��H��I�����L����7��H��$�H��t�H�t$H�|$��� ��H���5���H��$�H��$�H��H�T$@H�x�< ������H��$�L��D$@�����L$@�H���?�����\$8L�t$L�����L�������L�|$0��H��L�������1�H��H�����L��H�D$H����H��$�1�L���������D$@����H�t$H�|$0���H�D$H���;H��$��D$8L��$�H�D$L�|$H�L$1�1�L������H��$�L���B��H�D$L�MH�EL��$�H��$���~ZE1�E1�A�D��H�uI�y L��D)�AO�L�A��I��@���L��$�D9�~��t�����Hct$8H�D$0�H��$�I��H��Ht$HH�I�A A���Ff�VH�FH�n����D�|$81�H�|$����D�t$8A��E���]H��$�L�-��H�D$XH��$�H�D$`H��$�H�D$hH�L$XH�T$`�P�H��$�����A�Dž����$�����H��$�H�D$��H�5�L�Ϲ�H��$�A��A��H�$�A��A��A��H�ޅ�����I�D$�t$1�M�D$�t$0�.N�P�.NAPL��$�L��$�H�L$@��H�� D9�$��9H��$�Ic�H��L�dI�|$I�$H��$�H��$��'��Ņ���H��$��L��L�L�����������H�l$L��H�5��HDŽ$�HDŽ$�H���)��1�H��H�5V����1�H��H�5E�H�D$8���1�H��H�5/�H�D$H����H����H��$�H��H��H�L$P�K�����H��$�H�T$H�pH��$�H�x(����Ņ��|H�l$8H�����H�|$(H��H���z��H��H�D$8��H��$�H��$�H�x(�3��H�L$pH�T$PH��$�H�D$xH��$�H�x(�{��L�L$8�����H��$�L�L$8H�x(����L�L$8������H��$�H�L$x1�L�L$8H�|$HH�H(H��$�H�P�I�QH��$��D�H��$��
A�I�A���L�L$8fA�A D9�$������A��E������E��H�t$H�|$0�
��H��H���IH��$��x��H�|$0�~
���D$@H���[]A\A]A^A_���.NH�$�H��$�A��A��H�����I�D$�t$��M�D$�t$01��PAPL��$�L��$�H�L$@��H�� ��f.�H�$�H��$�A��A��H�����I�D$�t$��M�D$�t$01�1�PAPL��$�L��$�H�L$@��H�� ���f�H�UH���t$1��t$01�R��UL��$�H�L$@�D$p�b�H�� �D$P�+���D���H��$�L��$�H�{�2��I�|$H���5��H�t$hH�|$1ɺ�
������H�T$@H�����H�|$0� �n��f�H�t$H�|$H���@H�D$@�w
��L�D$@L�t$HH��$�H�|$0L��I�H��$�I�@���L��1�H�����H�SL�D$@H�
#�I�@H�H�@H�PL�`L�x H�@(A�@���1�H��$�E��I��H�D$L�d$��L�t$(H�L$1�1�L����
��H��$�L���Y���޿L�ML�EH�UI��L��$�L��$�ATAVRH�URH�L$@D�����H�� M���*����H�$�H��$�A��A��H���M���L�d$H�|$0L�����H��H������H��$�L�t$ L�|$(I��H���H��1�1�L���!
��H��$�L�����L���H�SL�KATI��AWL�RH�SR�T$`��H�� M��u����E1��@���E1��E���DAWAVAUATI��UH��SH��H��HH�L�l$L�����A�Dž�tH��HD��[]A\A]A^A_��L���p�H�L$H�t$ �H�D$(H�1�H�D$ H�ìH�D$0H�D$H�D$8H�x �I��A�Dž���L�羀���H�xH��I��H�H��H�@x1�H)�����H�H�|$�l��A�Dž�uuL�l$�H�5|�M�ML����€�D��E��t �H�5��L�������tJA�.NI�}���H�{L�����H������L�u����DH�{H�t$������D�
H�5'�L����������	H�5�L����������H�5�L���������H�5�L��������
�
H�5�L���������H�5ԫL���������H�5ȫL���������H�5��L���������H�5��L���������H�5��L���������H�5��L��������L�κL�L$H�=���%��L�L$���L�κL�L$H�=v����L�L$���L�κ
L�L$H�=l�����L�L$���PL�κ
L�L$H�=T����L�L$���L�κL�L$H�=<����L�L$����L�κL�L$H�=%��g��L�L$���L�κL�L$H�=��A��L�L$���TL�κL�L$H�=�����L�L$���L�κL�L$H�=����L�L$����L�κL�L$H�=Ӫ����L�L$����L�κ
L�L$H�=ª���L�L$���v���I�EI�y
�
1��D��3��A�F|�T���f.�I�UI�q
L��H�����I��.���@I�EI�y	�
1��D���
��A�F����fDI�EI�y�
1��D��
��A�F���I�EI�y�
1��D��
��A�F���I�EI�y
�
1��D��{
��H�Hi�@BI�F���I�uI�yH������I�F �y���I�uI�yH������I�F(�_���I�EI�y�
1��D��
��A�F0�=���I�EI�y�
1��D��	��A�F4����I�EI�y�D��/��I�F8����I�EI�y�
1��D��	��A�F@����I�EI�y�
1��D��	��A�FD���I�EI�y�
1��D��y	��A�FH���I�EI�y�
1��D��W	��A�FT�x���I�EI�y
�
1��D��5	��A�FP�V���I�EI�y
�
1��D��	��A�FL�4���I�EI�y�
1��D�����A�FX����I�EI�y�
1��D�����A�Fx��I�EI�y�D����I�Fp����I�EI�y�D�����I�Fh���I�EI�y�D�����I�F`���DAUI��ATI��US1�H��A�A�l<&��1<#t[<$������@8�uH��H��u�1��@<@��<~t<*uӸH��[]A\A]��@�� t����H��Dht�H��H���l���������H��Dht�H��H���B����{������H��Dh�e���H��H�������O����1�@����H��[]A\A]�D�k��H��Dh����H��H�����������H����ATUH��SH��@����a���H���H���]���@�DX u� H�����H��H��� H�kH�55�H���=������C�������C	�DP�k�d�D$(�����S
H�kH��
�������S��TJ�ЉD$(�C􍔀����C��TPЉT$ �B�������������C�LH��C���L$�������C���Dp��s��;�D$�������s����t~Љt$uK��=F�u�E�naJL������	��E	�1��A����9���H��H��u��1�H��@[]A\�D1��DH�5�H���	��A�ą����CH�k�������C	�DPЍPd��EN�H���D$(�C��������C��TPЉT$ ����������u���s������7�|$$H�t$H�|$�D$�D$8������?���H�D$�7���H�5z�H���V��������C�������C�DP�k�d�D$(��������S�������S�TJ�ЉD$(�C< tD������E��CH��A�TЉT$ �������G����*H��������3���H�5I�H�������������C�������C�DP�k�d�D$(���d����S	H�kH���������S��TJ���S��D$(��0�T$ ����L$(���&����Ⱥ��Q������)�k�d9���������)�i��)���d�������f�H���?USH��H��H����H�H���J��u1���G�� �YfDH�߾ �#���H�XH���H�5��H��������/�C�������C�DP�k�d�D$(�����S	H�{�������S
�TJ�H�KЉD$(��������C�TP��C�T$ �������C
�DpЉD$�C�������C�DpЉD$�C�������C�DpЉD$�B���wa�|$Z�|$;S�|$=L�1�AL�
������	��A�naJ	�1���A��A��9���H��H��u��1�H��H[]���DB �����H�����u���H�5p�H���a����Ņ��7�C�������C�DPЍPd��EN‰D$(��������C�TP��C
�T$ H�KH�{�������C�DpЉD$�C
�������C�DpЉD$�C�������C�DpЉD$�����1�Ã��ZA��� D�D$$�D$8H��tP�<+�e<-uA�
1�H���������QH����������)�)�k�di�)����)���D$8H�t$H�|$�D$�����������H�D$����H�55�H�����������C�������C�DP�k�d�D$(���O����S�������S�TJ�ЉD$(�C< t	��������C1��T��C�T$ �������C�DHЉD$�C
�������C�DHЉD$�C
�������C�DH�H�ىD$�a���A��������*L����������@H�5��H���1������8�C�������C�DP�k�d�D$(���o����SH�{�������S	�TJ�H�K���D$(�C��0�������C�T$ �DpЉD$�C�������C�DpЉD$�C�������C�DpЉD$��������������L$(�������Ⱥ��Q������)�k�d9���������)�i��)���d��������fD�
H��1�������QH����Љ����)�i�k�d)�k�<�D$8���H�5�H������������H�5�H��������t,�C�������C�DPЍPd��EN��S�D$(��0�v���H�5ܡH�������tx�C�SH�KH�{�s
��0k�
�DЃ�E�PdN���D$(�C	��0�T$ ��0k�
�D0ЉD$�C�s
��0k�
�D0��s�D$�C��0k�
�D0ЉD$����H�5e�H��������ts�C�SH�K�D$�s��0k�
�DЃ�E�PdN��S1��D$(���0k�
�T��C
�T$ ��0k�
�D0��s�D$�C
��0k�
�D0ЉD$���H�5�H���{�����th�C�SH�K�D$�s
��0k�
�DЃ�E�PdN��1��D$(�C	��0�T$ ��0k�
�D0��s
�D$�C��0k�
�D0ЉD$����H�5v�H��������tH�C�SH�KH�{��0k�
�DЃ�E�PdN��S�D$(���0k�
�T��C
�T$ ��0�o���H�5�H�������tm�C�SH�KH�{�s��0k�
�DЃ�E�PdN���D$(�C	��0�T$ ��0�D$�C��0k�
�D0��s�D$�C��0k�
�D0ЉD$�3���H�5��H���%��������C�S��0k�
�D�k�d�D$(���d����S	�K
��0k�
�T
���S�D$(��0�C�s
�T$ H�KH�{��0k�
�D0��s�D$�C��0k�
�D0��s�D$�C��0k�
�D0ЉD$���H�5�H���{����������C�S��0k�
�D�k�d�D$(��������S	�K
��0k�
�T
���S�D$(���0k�
�T��G���@SH��H�(���H�{0���H�{ ��1�[�ff.�f�AVAUA���@ATI��UH��H��S����L��H�EH�x H��������t[��]A\A]A^�f�H�{(L���d�����u�H�{0L���R�����u�E��L��I��L�����L��1�H���
���D�kH��L��H�H�
�!H�"���H�C�C�C8H�C���[��]A\A]A^�@ATUSD�G8E����H��H� I������Ņ�u�S�K9�tH�{H�3H��L�$�����)�9�Cƃ��S�C�C��tH�{(��Ņ�uHH�{ []A\�[���K8H�s ��t=H���E���Ņ�u�S8���t�~��[]A\�@H�{ �����D�CH�{0����k�Ņ�uًS�K9��K���H�s �DATUS�W8��ueH��H� I������Ņ�uU�S�K9�tf�{H�3H��L�$�����)�9�Fƃ��S�C�C��tH�{(�$�Ņ�uH�{ []A\�q����~��[]A\�@H�{ �W����DH�{ ��B���ՋG�ff.��ATUSD�G8E��uCH��H� I�������Ņ�u3�S��uU�K8H�s ��t,H�����Ņ�u�S8���tf��~��[]A\�@�CH�{(�S����k�Ņ�uY�S��t`�sH���H��H��I�$�K�S��)�9�C‰C�C��tH�{0��Ņ�uH�{ []A\�f���fDH�{ �W����w���H�s �M���f�ATUS�W8��umH��H� I�������Ņ�u]�S��ta�sH���H��H��I�$�K�S��)�9�C‰C�C��tH�{0��Ņ�u:H�{ []A\����D�~��[]A\�@H�{ �������H�{ �����DSH��H� �s�����t[�DH�{(����H�{0����H�{ [�\���ff.��SH��H� �3�����t[�D�C8H�{ �(�����u�H��[���f.��AUATUSH��H��H�h���C����L�kHE1��H�kH��H�s@H�UH�MH�}H�JH�UH�MH�JH��k�C�S8L�m��DE�H�C`H�EH�C`H�h�CH�k`�����u8�C��uPH�{h�s���H�{h��H�{p�!���H��D��[]A\A]�E1���H�
����H�5X�H�=d���H�
����H�59�H�=T��}�ff.�f�H�WXH�GHH9�t#H�GXH�PH�HH�JH�PH�HH�J�fDH��H�?� �/�f�@H���ff.�@AVAUATUSH��H�h�|�C9C���C9C��L�k8�:fD�CH�{p�C��A���C9C���C9C��H���,���H�s@H�H��H�x�S0A���L�mH�CHH�{ H�EH�CHH�hH�kHt��\�H�E�{���H�{ ���C�E1�I���hH�kPL��H+UH;S |gH�UH�M��H�s@H�}H�JH�UH�MH�JH��C�k�S8A��H�CHH�EH�C`H�EH�C`H�hH�k`E��u3�S�C��D��IS9��H�{hE1��D���[D��]A\A]A^��H�{h�'���[D��]A\A]A^�H�CHH�{hH�EH�C`H�EH�C`H�hH�k`��[D��]A\A]A^��AWAVAUATUSH�����9��
9��9�������M����H�|$H�|$`��M�;xM��A��A�����1�H�xH��H�@pH��H��1�H)���x���H��kH�{hD�{H�D$`H�T$`D�cL�s H�H�D$PL�k0H�C8H�D$XH�C@H�C8H�CHH�CPH�CHH�CXH�C`�v�����uMH�t$`H�{p����u9H������u>H�
w!H�;H�����H���u�H�D$H���H����[]A\A]A^A_�f�H�������fDH��H�?H�s����.���ff.�AWAVAUATI��USH��H��H�h�C�L�{ M����L�kH�C����H�kH��H�UH�MH�}H�JH�UH�MH�J�CH�C H����L��H+UH9����kH�s@H��S8L�mA��H�C`H�EH�C`H�hH�k`E��t�H�{h���H��D��[]A\A]A^A_��3��C�K9K����`H�S(H�shH�{pH��t����A�ƅ�t�뫐���I������I�<$H�{hE1�L�mH�C`H�EH�C`H�hH�k`�8����v���H�SH��E1�H�JH�rH�qH�JH�rH�q�CH�BI�$H�CHH�{hH�BH�C`H�BH�C`H�PH�S`��������f����H������H�s@H�H��H�x�S0A�ƅ�uH�E�CI�$H�CHH�EH�C`H�EH�C`H�hH�k`���ff.�@ATI��USH��H�h�M�H���U���H�{ H��L�`H�C8H�EH�CHH�EH�CHH�hH�kHu+�CH�{p��H�{h����H��[]A\���f��k�H�E��DH�w(�ff.�USH��H��H�h��H�{h�k+k���H����[]�fDUH��SH��H��H�h��H�s@H�H��S8�kH�{p����H�{h�v���H����[]�ff.�f�U��H��H�C���SH��H��H�?�S���t&H�;H�
�!H��H��H����[]����H�;H��H��H�����[]���H�GH����H�H�H9�t{E1�E1���H�H�H9�t`H9�wM��tL9�sI��I��H�AH��u�H�VL��L9�s6J�N�L�J�I)�L�L�AH�BL�BL�IH�RH�1H��tL�L�ff.�L�7I�II�AH����H�DI�AH��tH�L����L�GM����J�L9���M��s�@H�H9���rI��H�AH��u�M�QM����M�AH�wI�AH����H�����H�q�f.���utH�GH���b���L�WM���J�L9���M��s�IH�H9���rI��H�AH��u�M�AM��u{M�QI�AH�wH���t����fDH�GH�����L�GM��������H��fDI�AI��N�I�I�@N�L9�teI�AI�p����H��DI�AI��I�I�@I�AI�p���DI�L�2I9���H�AHI�I�AH���Z���H�t�I�H�I�H��tH�L��M����I�AI�AH�w�I�AI�AH�w�I�AM�AH�wI�A�g���I�AM�QH�w��AVM��AUI��ATI��USH��H��H��tC�H����tM���)�������7����H��[]A\A]A^�@�$H��H�D$�(L����f�@H�@ �oMI�EL�`L�0H�XH�EL�#I��H�CH�CL�cH�C H�C(��t6������tX�����V���H�}H��[]A\A]A^���H��1�[]A\A]A^ÐH�~�����B�������f.�H�}H��[]A\A]A^��H�~����DH�~�o��DH�~���DH�}H��[]A\A]A^��S�wH����t=��t(������������[�fDH� �/���u�sH�KH�QH��t(H�H�PH�@H�@H��u�H�AH�QH��t/f.�H�H�PH�@H�@H��u�H�AH�H�C��t(��tS��tn�����M���H�{ [���1�[�@H� �?��;���f.�H� �g��#���f�H�{ [�V�fDH� �7�����f�H�{ [�v��fDAUI��ATI��UH��SH��H��H��tEL��(�x�f�@H�@ H�U�oI�EL� H�hH�PHH��1�[]A\A]��$H��H�D$�ff.�1��ff.�f�ATE1�USH�^H��H��H9�w[�GH����t$����������������H�}H���N���I��H��u&�E��t��tZ��tu����v-L��[]A\�DH�}H��1�I������E��t���DH�} ������DH� ����DH�} ����DH� ����h���f�H�} ����DH� ���H���f�H� �W��8���f�AUATE1�UH�nSH��L�mH��L9�w_�GH����t$����������������H�{L���8���I��H��u0�C��t��tt��������vCH��L��[]A\A]�DH�{H��1�I�����H�{H��1�L�����C��t��@H�{ ����DH� ���n���f�H�{ ���DH� ���N���f�H�{ �����o���f�H� �g��.���f�H� �'�����f�H��/�ATUH��S�GH��L�g��t9������������uyH� �����uqH�}�	fDL��H�s�I�I�D$H��t\H9tu[I�D$H��tH9tuJ��r����E��tk��������������D�[]A\�fDH9wt��E��t�����������w�H�} �X���뾐[1�]A\�f�H� �7��*���f���f.�H� ���
���f�H� �����f�H�} []A\����H�} ����J���DH�} []A\���H�} ����"���f.�H�} []A\����H�GH���H��H+G��H����AVAUATE1�USH�ZH��H9�v[L��]A\A]A^�H�����H��H��I�����I��H��t�H�EL��H��J9\(�JF\(���L��H��I����H��L��H�����L��H�����[L��]A\A]A^�DH���h��Hc�H��H���@AWAVAUI��ATUSH��H��H�����H���H�H9��L� I�D$I�$H�I�$I�T$H�PM�$$1�M�d$M�l$I�D$I�D$ L�5���I�|$�{���A�D$ ���)���!H�S(H�CH9�rH�CH��u	H�C@H��u
H�CH���H�C(H��H�C(H���I�$H�PI�T$H�PL�"L�`H�C@H���mH�S(H�CH���H���H9�vH�SA�D$ H���{���A�T$ I�$L9�t%H�C(H��H�C(I�D$I�$H�I�$I�L$H�H������H�C0H��H�C0H���I�$H�PI�T$H�PL�"L�`�fDA�|$ �DH�C@H��t+H�CxH�(H���H9���L�}(�Y��I9��pH�C8H���H�SpH�*H����H9��uH�C8H��H�C8�E(����H��H;����H�EH�UH���H�H�EH�UH�PH�CPH��H�CPH�E I�D$�[������uL��H��L��1����H�uL��UH������H���H�EH�PH�UH�PH�*H�hA�D$$I�D$������A�D$$H������A�|$ ����fDI�D$I�$H�I�$I�T$H�PH�C0H��H�C0�V���fDH�uH���H9�t�V(��8����Hǁ������H�C@H��H�C@�����H�SxH�H����H9���H�h(���H���H���H��H)�H��������$�������uH�CH��tH�ChH��H�ChfDH���I�$H�PI�T$H�PL�"L�`H�k u
�����u'H�����L��1����H��1�[]A\A]A^A_�H����%����H�;�(����I��H�����H����^��L���q��% ���H�
����H�5��H�=K����H�
g���H�5��H�=���w��H�
H���H�5d�H�=���X��H�
)���H�5E�H�=U��9��H�
"��CH�5&�H�=X����H�
ۃ��H�5�H�=`����H�
����H�5�H�=������ff.��ATI��UL��SH�� H���H�0H9�tcH�H�CH�3H�0H�H�sH�pH�L�cH�[H�SL�C H���K(H�� H��[]A\�@�k��H�H�C(H�� H��[]A\��H�?�0L�D$�L$H�T$�5��H�T$�L$H��H��L�D$u��ff.�f�H���H�H9���ATUH��SH��L�d$DH�H���H�CH�H�H�H�SH�P�T�H�sL������H����,��H���H�H�PH�SH�PH�H�XH���H�H9�u�H��[]A\���ff.�@AWM��AVI��AUI��ATI��U��SH��(H���D�D$���A�������L������E1�@��M��L��L��L���4���H���3�p(�������M��I���H����I�NpH9��6H���fDH�H9��@:r(r�D�L$E���@H9�t@:r(v�`@8r(�VH�H9�u�H�H�QH�PH�QH�H�AI�F8H��I�F8I�V8I�FXH9�vI�F8I�FXI�F H��t[I�F(H��uI�V I�FH9�r8�I����D��I�����H��(��[]A\A]A^A_��I�V8I�FHH9�v�M�1�H�|$L��H������J����uVI�F H��I�F I�V I�F`H9�v�I�F 1�I�F`끐H�������*���f�I�������r���f.����I���f�H�H�JH�HH�JH�H�BH9�����I�������DH��������t2I�����Hc�H��t�X�H��I����H��u?���u�I�VpH�H�JH�HH�JH�H�B�fDI�����G����f�H�H�QH�PH�QH�H�A�T���H�
F�H�5�}H�=s~�v��fDATA��UH��SH��H�������H���H���E����L�S(H�ML9���H�L�GH����1�DH��H�H9�u�H�QH���@ I9�t,H�VM�J���@ H�zI9�tH��H�I9�u�I9�uiL)�H��H�M���H���[]A\�9�f�L�S0H�MH��L9��]���H�����[H�E]A\��M��t�1��Z���H�
�}��H�5L|H�=�|�@��AWAVI��AUI��ATI��UH����SH��H�H�����1�L��H�xH��H�H��Hǀ�H��1�H)�������H�H��L�cH��H��H�kH�CH���A�ą�tH��D��[]A\A]A^A_�f�H���L�����A�ą�u�H�3H������A�ą���H�3H������A�ą���H�3H�������A�ą���H�;��*��H�CpH����H�H�;�H�@�	��H�CxH���lH�H�;�H�@����H���H���HH�H�;�H�@����H���H���$H�H�;�H�@���H���H���H�H�;�H�@�|��H���H����H�H�;�H�@�X��H���H����H�H�;H�KH��H�@L�l$�z��H�������K@L�H��H���1�L�����A�Dž���H�C H��H�C H�S H�C`H9�vH�C H�C`H��H��u�H����P��I�����H�������H����X������H���A�����H�������H������H���������DH���E���������H������H����t��H��������X���SH��H��H�?H��:��H�;���1�[�ff.�M����A��o���ff.�@AWI��AVM��AUI��ATI��USH��H��H������������YH���q���1�M��M��L��L��H�����H���bH�KxH�H��t9H�p(H;r(��H�H9�u��H9r(��H�H9���H��u�H�C H��t,H����8��H������H����[]A\A]A^A_�L�1�H�|$H��H����O������H�C H��H�C H�S H�C`H9�v�H�C 1�H�C`�f�H�K@H��H�K@H�H�JH�HH�JH�H�BH�C H���]�����H�S@H��H�S@H�H�QH�PH�QH�H�AH�C H���%����L���@H�����������f.������f�H����������f.�M����E1��r���f�AVAUATI��UH��SH��H����2��H�E8H���H�E@H��tLH�uxH��L;` tH��H9�t2H�M��u�H�U@H��H�U@H�PH�8H�:H�H�@H�B���H���L�l$H��H9�tH�SM����I9��„�t4H�H9�u�H������H������H��1�[]A\A]A^�f�H�sL���T��H�D$L�0����H��L����������C$H���H�������H���H��[���H�����e���DH�upH���L;` tH��H9������H�M��u�H�U8H��H�U8�P(����H�|�H;��tH�PH�8H�:H�H�@H�B�L�L���L9�tE�@(A��D8�t�HLJ��H�
�v�H�5�tH�=$v�����H�G8�ff.�H�G@�ff.�H�G �ff.�H�G0�ff.�H�G(�ff.�H�GP�ff.�H�GX�ff.�H�G`�ff.�H�Gh�ff.�H�G�ff.�H�G�ff.�S�H��H��H�wH�t$H�t$���H�D$H��uH��[�H����d��H������H����\��H�D$H��[ÐH�GH�w��H�G�ff.�AUATU1�SH��H�wH�G H9�s^H��L�g(H��H)�L9�s]H)�L�l$L�H�t$�L��H�����H�|$t$H������H����u��H������H��H��[]A\A]�L�l$L)�1�L��H�l$L�����1��f.�S1�H��LJ����1�H�����H����E��H�C H��uH����H����8��1�[�@H���H��������ff.�H�GH�ff.�H�GHH�wH��SH��H��H�5vrH��H�|$�����uH�T$H��tH�R H�H��[�f�H��}��f�H��� 1�H��� ��H�=�� �d��@H�=�� �d��@UH��H�=�� SH���������H�����H��H����H9�u
�DH��H������H����H9��„�u�H�����H��1�H�=Y� H�J� �U��H�
~� H��1�H�2������{��H�=� �/��H����[]�fD�H�=�� H��� �H���H�������u�1�H����[]�f�H���c����AWI��AVI��H�����AUI��ATUSL��H��XH�=�� H�t$L��H�L$H�D$(����A��I�H��tH��XD��[]A\A]A^A_��H�=I� �T��H�|$0H��H�5FrH�$�����uH�t$0H�|$8H���v������H�ߺ��L��H�D$8H�����H�
rH�H�D$8�P����H�L$(1�H�\$@H�L$�f�H��9��H���H�@�H��H�4����I��H)�I9�vH=�wI�WA�/H��I��H)�A�L��L��I)�L���t��H�$H�|$H�����A��M��t	H�D$(I�EE��tuH�D$8�P�r�9��j���L��H�5AqL���(��H��L��H)�H��H�����H�$H�|$H�����A��M��t	H�D$(I�EE��tH�D$8�P����@H�T$H�t$(H�|$���A����tH�|$(D�$�o���D�$�*���fDH�<$L��D�D$�O��H�L$H�=s� H�����H��H�	���D�D$����H�|$8�R���A�3N����f.��H�H�GH��f.�H�_p��SH�TpH���H��@H� H�D$H�=pH�L$H�t$H�D$ H�,pH�D$H�D$(H�D$0H�D$8�!��H�{ �H��H�{�?��H��@1�[��SH��1ҹH��H�w(H�0H�D$�����tH��[ÐH�{0H�3H�T$�����u�H�D$H�H�C�H�{0�B��H��[�ff.��ATUSH�H��H�x�}���L�#H��H��I�|$���H��I�D$(L�#I�|$�u��H��I�D$0H�H�x ���H�H�R(H�JH�H�JH�HH�JH�H�B[]A\�ff.�AUI��ATI��H��US1�H��8I�$H�|$�8/��1�1҃������tH��8[]A\A]ÐH�t$1�1�H�|$ �������H�|$�@�6��L�D$1ɉ�H�źL�@H�D$ H�} H�E�����uHH�}����I�4$1�L�e8H�EA�L$H�|$(H�E�>/��L�ME1����G����t#H�|$�D$�U���D$H��8[]A\A]�fDH�} �@B������u�H�} H�t$(�0����u�H�E8H�} �p0Hi�@B�����u�I�mH��8[]A\A]�f��W�f;WsH�G�ʃ�H�4�1�f�W�F�DAVAUATUS�Gf��t:H�_��A��I��L�l�DH�+L��H�}�����ufD9utH��L9�u�1�[H��]A\A]A^���F��t�F1��ff.�@SH�~ H������C臾��H�{ H�C(�
��1�[�fDAWAVI��AUI��ATI��H�5�dUL��SL��H��8I�I�H�T$H�$H�D$ H�x�g��H��tB�
1�H���S��H�D$ H��u3H�E1�H�EH��8D��[]A\A]A^A_�DH�D$ H��t�I�~(H�T$(H�p����A�Dž�ueI�~(H�t$(����I�~(H�$H��H�T$ H�D$�%���A�Dž�u6I�~(���A�Dž�u&H�D$I�F(H�D$ H�H�H�H�M�D��d���I�}L�����M���L���L��L������<���AWH��A��1�AVI��H��AUE��ATE��U��1�SH��(H�|$�@���H�|$�P��H�|$L��H��H�x���fD�{1�H�{ H��D$h�CH�T$�C0H�C8�C@�����tH��([]A\A]A^A_�DH��H�u���D���t$ H�{L�
���D��SPD��$��O���H�� ��u�H�{��D$���H�T$p�D$H�H��([]A\A]A^A_�f.�AVI��AUA���8ATI��US����A��L��H��L�`H��fD�h1�f�C���H�C H�C1�H�CH�C0H�C(I�[]A\A]A^ÐH��t;�����1�L�
l1�A��2�O��A��H��E3�D��H9�r���fD1��ff.�f�H�����H����%��f.�H�G H��tH���1����f�ATUH��SH��@H�L�d$L�������Å�tH��@��[]A\�L������H�-iH��H�t$H�D$H�i�H�D$ H�iH�D$0H�D$H�D$H�D$(H�x H�D$8����Å�u`H�|$���L�d$�Å�u%I�4$��.NH�=�h��À��ۅ�E�I�|$�Ļ��H�}L���Ⱥ��H��@��[]A\�DH�}H�t$�ʹ��H��@��[]A\�ff.�@AV�A�օ�DD��FAUATUSf����I��E1�1��BH�{ �G���L��H+C(H=@KL~L�c(H���,�����tHH�{ ���,��A�E��9�vI��1�B�D5��I�E��H�ЋC��t-M��u��k���I���fD�CH�{ ����A�M9�tH��[]A\A]A^��1�H��[]A\A]A^�f�H�O0H��H��t��H�(H���f���H��1�����@AWAVI��AUATI��H��UH��SH��8H�$�
���H��L��H��I���9���L����o���H���&H�T$H�xI��H��H�T$�]���Å�t'L��L���,���H��8��[]A\A]A^A_��H�T$H�\$ H���.���H�߾@1�H�
�fH��fHDŽ$�H��$�H�
�fH��$�H�
�fH��$�L��HDŽ$�HDŽ$��D���H��$�L��H�l$`H�H��$��@H��H��\H��$�H�&f1�H��$�L��$�HDŽ$����H�L$H��$��	H�H��$ H��$H�$H��$H��$H�D$L��$HDŽ$(H�x ����Å�uYH�|$����Å�uIH�l$�H�=�eH�EH����À��ۅ�uBH�}�i���I�H���m����\����I�H�t$�r���L��L���g����6���f�H�ƹH�=(e�������ہ�����.N�@����fDAWAVAUI��ATUH��H��SH��H���H�T$D�D$脸��H��H��H��I��賽��H������H����H�L$ H�xI��H��H�L$����A�Dž�t L��H��襷��H���D��[]A\A]A^A_�H�L$L�|$0H����L��L��1�H�5LdH�2dHDŽ$8H��$0H�5/dH��$@H�5%dH��$P�@HDŽ$HHDŽ$X�Ľ��L�L$p�L$L��$xH�L�Ͼ@L�L$H��$hL�%Z1�H�ZL��$`L��$�H��$pL��$�HDŽ$��[���L���@H�fcHc�1�H�K��>���L�L$L��H��$�H�H��$�H�7c�@H��$�H��1�L��$�L��$����H�L$(H��$0�H�H��$�H��$�H�D$L��$�H��$�H�D$ L��$�HDŽ$�H�x ���A�Dž�uTH�|$ ��A�Dž�uCH�\$ �H�=�bH�H����€�D��E��u;H�{�r���I�~H���v�������I�~H�t$ 肳��L��H���w�������f�H�ƹH�=8b�������E�A����A��.N떐A����DAWAVAUATUH��SH��H��H���H�t$H�L$L�D$蒵��H��H��H��I�����H�߉����H����L�|$ H�xI��L�����A�Ņ�t#L��H��踴��H���D��[]A\A]A^A_�L��L�l$0���L��L��@H�paH�DaH�D$xH�D$pH�$aH��$�H�JaH��$�1�HDŽ$�HDŽ$��ߺ��H�L$(H�t$p�H�L��$�H��$�H�%WH��$�H�D$ H��$�H�x L��$�HDŽ$�蕿��A�Ņ�u^H�|$ ��A�Ņ�uMH�l$ �H�5�`A�H�UH�������uDH�}�[���I�~H���_�������f.�I�~H�t$ �b���L��H���W������f��:$A�.Nu�L�L$L�D$H��H��H�L$L����H�l$ A���fDA��U���ff.�f�AWAVAUI��H��ATI��USH���q���L��L��H��I��蠸��L����ֶ��H����I��H�xH��L���˿���Å�t%H��L��蚲��H�ĸ��[]A\A]A^A_�fDL��H�\$��H��L��@H�P_H�$_H�D$XH�D$PH�_H�D$`H�7_H�D$p1�H�D$hH�D$x�˸��H�L$H�t$P�H�H��$�H��$�H�UH��$�H�$L��$�H�x L��$�HDŽ$�肽���Å�uTH�<$�s��Å�uEL�$$�H�5�^I�$H����À��ۅ�u?I�|$�M���H�}L���Q�������@H�}H�4$�[���H��L���P������H�ǹH�5@^�������ہ�Q���.N�@��t���ff.�AWAVA��AUATI��H��UH��SH���t$L�D$�e���H��L��H��I��蔶��L����ʴ��H���!H�T$ H�xH��H��H�T$踽��A�Dž�tH��L��膰�����H�T$H����A����H�]L�|$0L��@H��$�L��H�m]H�]]H��$�D$HDŽ$�HDŽ$��H�']HDŽ$HD�H��\H��$1�虶��L��$8D��L�l$pH�H��$0�@L��H��$(H�-�R1�H��\L��$ L��$�H��$@HDŽ$H�6���H��\�@L��Lc�H�1�����L��$P�	H�L��$`H��$XL��$hH��$pHDŽ$xH�D$ H�L$(H��$�H�x �Ժ��A�Dž��9H�|$ ��A�Dž��$H�l$ �H�5�[H�UH��������-�::�DA�.NH�}腮��H�{H��艭����@�T$L�t$0L��@H�w[L��HDŽ$�H��$���H�	[H�r[H��$H�\[HDŽ$HD�H�[HDŽ$H��$1��д��L��$ �H�H��$0H��$(H�QL��$8H��$@HDŽ$H���f�H�{H�t$ �«��H��L��跭��H�ĸD��[]A\A]A^A_�f�A�����DA����H�z1��
����H�L$H�l$ ����ff.�@AVI��AUI��ATUH��SH��PH�L�d$L���J����Å�tH��P��[]A\A]A^�DL���8�H�L$H�t$ �H�D$(H��YH�D$ H�~YH�D$0H�ZH�D$@H�D$H�D$8H�D$HH�x �l����Å�uVH�|$�\��Å�uFH�t$H��8$tYH�}�.N�{���L�d$I�|$�<���H�}L���@���H��P��[]A\A]A^ÐH�}H�t$�B���H��P��[]A\A]A^�H��L�L$M��L��1�H�������@AVAUATI��UH��SH��H���G<��t,H��tH�wHH����I�$E1�H��D��[]A\A]A^�@1�1�H�|$�J�������H�t$L��H����A�Ņ���I�<$H�5�X�׸��H����I��H�x�
L������
L���C8H�$H�x����
L���C<H�$H�x�ʰ���K<�S8H�5xX�C@H�{A��1����H�CHH��H������H�|$I�$H9��������H��D��[]A\A]A^�fDH�l$H���&���H�sH�f.�H�|$H9�u������I�ȉ�H�����ff.�I�ȉ�H��1��������f.�AV1�I��1�AUATI��USH��H�� H�|$�ݩ����u9H�t$H�T$L��臮��A�Ņ�t0H�|$H9�t����H�� D��[]A\A]A^ÐH�\$H����fDH�߾��C���H�5@WH�xH��H�H��Hǀ�H��1�H)�������H�H�\$H�����H��tH�x�
1��)����EH�5�VH���׶��H��tH�x�
1������EH�5�VH��谶��H��tH�x
�
1��ۮ���EH�5�VH��艶��H��tH�x�
1�贮���EH�5�VH���b���H��tH�x�
1�荮���EH�5�VH���;���H��t
H�x
轴��H�E H�5VH������H��t
H�x蜴��H�E(H�5kVH�����H��t
H�x�{���H�E0H�5_VH���ص��H��t
H�x�Z���H�E8H�5ZVH��践��H��t
H�x�9���H�E@H�5SVH��薵��H��t
H�x����H�EHH�5HVH���u���H��t
H�x���H�EPH�5>VH���T���H��t
H�x�ֳ��H�EXH�55VH���3���H��t
H�x赳��H�E`H�5#VH������H��t
H�x蔳��H�EhH�5VH����H��tH�x�
1������EtH�5�UH���ʴ��H��tH�x
�
1�����ExH�5�UH��裴��H��tH�x�
1�����E|H�5�UH���|���H��tH�x�
1�觬�����A�D$8H�\$��ts�EA�D$<�EA�D$@�EH�5�UH���1���H����H�x�H�5xU����������EpM�������I�.H�� D��[]A\A]A^�f.�H�5�SH���ѳ��H��t�H�\$H�x�
H�����H�޺
A�D$8�EH�D$H�x�ث��H�޺
A�D$<�EH�D$H�x身��H�\$A�D$@�E�(�����Ep�N���@H���ff.��AVH�SH�GL�WH�_L�@�L�M�H9�vIA�E�I)�D8u+I�x�I9�w4J�H���H��H9�tH��D�7D81t��H4�H9�w�1�[A^�H���ff.�AVAUL�,ATUSH�GH�_L�wH��H�,L�$L9�sG�²��H�8L��H����H��H9�r)H��D�D�	B��B9�t��E��I,�L9�r�1�[]A\A]A^�DAVAUI��� ATA��UH��S�%���L��L�hH���V���H�CH��uH�����H�CH�H��[]A\A]A^þH�����I��H���H�SH��H�P�H9�u�H�kE��tJH�o���H�1�H��t(@H��A�LH��H��H�I�,�H�kH�U�H9�w�L�sH��[]A\A]A^�H�����H�H��t�臱��H�01�f�A�T��H��H��H��H�I�,�H�kH�U�H9�w�L�s�f�1�H��tYH�5� H��tMUH��SH�� H���H��H�3H��tH��蔠����u��CH��[]�DH��1�[]���ff.�@AWAVAUI��ATA��UH�-jFSH��H��(����H�vH�KH����A���nH���A����H�
$FI��H��H���aH�5FE1�L��1�葭��H��L�s M��tm�:L���H���H����L�
�UH�
�UH�{(���sPL�=�EL��f����H��M��H�5FC1�jL��AWRH������H�� H��H�3H��tH��E1�H��BL��1����H��A��u_H�C@H����L�
UA�� u^L�C8M����A�� H�
�T��H�S0jH�5EL��PH��HD�H��1�薬��H��XZH��(H��[]A\A]A^A_��L��D1�E1�L����H���A��tDH��L�gTH��A��H��DHE����E1��R����H�������A���R���A��H�,TL�THD�H��A�=���L�QDL���!���f�L�=9DL������L�
)DL���P����H��I��H���^���f�H�;L�L$H�L$�t$L�|$����t$H�L$L�L$H�T$f9�t5L�{(L�s H�OA����f�H��H��L�cS���fDL�s ��ff.�@AWH��1�I��AVI��AUI��H�zH��ATL�%�SUH)�S��X��H��8H�BPH��H��JR�</��A�t\�FH�^A�tDH���A�u�L��I9�t5�;:u0H��L��H�kL��L)����I��{/�>I9�uc�@H���/L���(���H����H9�w�:�H��H9�t)�}:u�.NH��8��[]A\A]A^A_��~/��L���EH��A��u-DH���A��t�H9�tH��H��L��H)��4���I�F0�1�t�H��<?u?�#H��肠��I��H��tBH�pL�����L��H��L��I�F@H)����I�F8�T���H��L���դ��I�F@�@���@H��L��轤��I�F8�(���@�:L������H���	����'����{/�����H���H��A����fDH���EA��t�H��H)�H�D$I��L��H��L��L�$�A���I��L�$I�F�@A��@��M��M�O�L9�v�;[L����:H���С��H��1�I��M���(L��I��H)�H)�L���ڛ��H��L��L��I�F L)��ś��I�F(I9��
H�t$(�
H���&���fA�FPH�D$(�8�(������fD�~/H�^������L�Ⱦ:H��L�$H)�H��H�D$�&���I��H��L)�H�D$M����L��H��L��L�\$H)�H�D$L���!���L�\$L�$L��I�FI�sL��H)�����L�T$I�F�����]H��跠��H���M����x:H�s�L�x����H�T$H)�L��跚��I�F �C���I�>覡��fA�FP�1���H�D$E1��8���H�T$H��L��H�$L���t���L�$I�F�N����AUH��1�ATI��UH��H�zH��SH��H)���X��H��H�BPH��H�H��JR����H�CA�<$[���:L���m���I��1�M��t/L��L��H��L)�H)�����I�uH��H�C �ϡ��H�C(A�}uH���.N[]A\A]�@H�t$�
H������f�CPH�D$�8u�H��1�[]A\A]��]L�����H��t��x:u�L�hI����^���fDSH��H�� H�T$ H��$ H�$H�D$1�D�H��H=u�H�{ H�L$H�T$H��H�D$L�D$H�D$�|���H���tH�D$HD$t#H�{ ���H�sH�{脨��H�C H�� [�H�;����fo�$ H�Cfo�$0Hfo�$@P fo�$PX0fo�$``@fo�$phPfo�$�p`fo�$�xpfo�$���fo�$���fo�$���fo�$���fo�$���fo�$���fo�$��fo�$��H�{ 覢��H�C ����H�� [�DH� H���tH���}�����u1�H���f�1��D������D�H���f�AVI��AUI��ATUH��SH�H���eI��H���M���?I�����(H���R���f�L��H��H��H�@ H�(@���L��H��H�C�ߞ��H�{H�C��H����L��L��謝����tIL��L���m���H�C H�����H���G���I�]H�
�� H��H��H�������[1�]A\A]A^�H�;�袛��1�H�C�f.�H�C�H��H��u�H�C �����[�]A\A]A^�H������I�����H�����I�����������[]�A\A]A^��D��H����I�����H�����I�����f.�1�H����1�ÐH�G H���t6H��H��H�4$H��H�L$H�L$����H��1�H���t^H���f�1�H��tAH�I9L�WI��MFM��t1���<A�<:@�<H��I9�u�H�L)�H�1�M)���蛔�����tD~��t-��T�D�H���D���xD�H���f��x�X���fD1��K���f�H�GH��t	@���0ø������H��H�?H������f.�@�G��uH�GH�@8H�G�ff.��H� 1��ř��DSH��H� ����H�C 1�[��AUATUH��SH��H��t.H��L�+L��荖��H��L��H��I��蜛��H�[L�H��u�H��H��[]A\A]�f�ATUH��SH��tNI��I�\$`H��u�5DH�[H��t'H�3H��蜚����u�C��u0�C[]A\�f�M�d$8M��u��}[�]A\%�-�ø������f.�AWAVA��AUM��ATUSH��8L�gHH�oH�|$�����������1ۃ���H��tE1�f�H�}臕��H�mI�H��u�L�M��t_1�A�������$�4$M���L���l���M�|$(I��M��t1�DI�?�0���M�H�M��u�I�M�d$@L�M��u�H��8H��[]A\A]A^A_�f�H�D$H�@H�D$A���zA���D1�H�D$Hc@�����M��tA�D�A���	��H�D$I�\H�8蟔��H�M���eH�\H�D$L�xPM����@IcW�����A���IM��tA�T����	~m���c~c����~V���'~I�	����~<�
��?B~/�����~"�����~1����ɚ;@��H��
DI�?H�t$�ӓ��I�H�$�Ɠ��H�t$H�\H$H�M�M���0���H�L$H������H�D$H�@8H��t
H9H���H�|$�x���H�\������P�����L�Lc�1�f�K�<�L�$�C���A��	L�$���
A��c~j�A���~\�A��'~N�A����~@�A��?B~2�A����~$�A����~1�A���ɚ;��H��fDH�\H�I���_����I�?蠒��I�H�$蓒��H�$H�\H�����f�H�\
E��u�H�D$H�������H���`���H�\H�D$Hc@�������H�D$H�8�<���H�\M�������H�������H�����@H�t$H�F`H��u�X�H�@H��tG;Pu�H�8���H��I�?H�T$�ڑ��I�H�$�͑��H�T$H�\H$H������H�v8H��u�1��H�GH�D$H�D$H�p`H���/�FI��1ۉD$(Hc�H�H�D$ �H��9T$(u��f�9P��H�@H��u�H�D$
H�D$ H�4$H�<��3���M�HD$H�H�4$M����IcW�A���c�T���A�=��C���A�='�2���A�	=���!���A�
=?B����A�=�������A�=�����E1�=�ɚ;A��I��
����f.�H�8�T$,H�4$�p���H�4$HcT$,H��
H�D$����1�H�|$H��tH�4$�D���H�4$H�\H�T$�B���u���f�9FtH�vH��u�H�R8H��tWH�r`��H�>���I��H�D$J�\;H�8���H��B���H�D$�H�xH���-������H�X����1��<���E1��ff.�f�AW�B�I��AVAUATI��U��SL��H�����…�H�L$��ˆT$��H�~HM���D$��A�T$I�$��������GH��tHc‹�H�5�BL��1����Lc�O�4M�|$PM��u@�x�����H��tHc‹�H��L��H�5�B1�踙��H�M�I�M��t:A�WM�GI�7���u�H��L��L��1�H�5|B胙��M�H�I�M��u�DI�T$H��t+��tI�D$8H��tH;PtL��H�5^B1��@���H�Iƃ�������T$����A�>I�t$I�~�{���M�l$HI��M��tLE1���L��A��A��L��I��A�D��H���Q���I�u(H���5���M�m@M��uπ|$I��t<A�T$I�$���������H��tHc‹�H�5�AL��1��{���H�I�H��L��[]A\A]A^A_�@1�A�T$H�~��I�$�D$���� ���H��H�5AL��1��,���Lc��,���@L��H�A`H��u
�2f�H�@H��t';Pu�H�H��L��H�5�@1����H��.���@H�I8H��u�H��/��fDM�d$8M���I�D$`H��u��fDH�@H��t�;Pu�H�H�5�@L��1�膗��H����������I�t$L������M�l$HI��M���S�������@�/>M�~fA����fDH�D$�D�x�����Mc�H�\$L��I��M��H�D��L��H�5@A��J�(1�I�����H�I�A���u�H�\$���L��H�F`H��u
�2f�H�@H��t';Pu�H�H�5�?L��1�螖��Lc����fDH�v8H��u�H�0.��fDI�D$`H���A���I���IcWH��u�UDH�@H��tG;Pu�H�I�E�9L��t:H�\+L��H�5X?1�����M�H�I�M������I�D$`롐I�EL��H�
�-H���L�vI��M��tL�����L��L��I��H������M�M�}A�E�G���H��H�5�>L��1�袕��H��"���H�D-���ff.�@H�G H��tS1�H��H��������t�C��u0[�@�G�.N��CH�{ �8����C(�C��tи.N[��ATUSH��H� H��tPI��1ҹH�5�,認����tf�kH�{��u6H�4�H�����M��tH�I�$��[]A\�f��CH�{H�޽.NH��������[]A\�f.��CH�{ 耆���C(�ff.�ATUH��S�GH���G����~2��t]��H�5C>H��=HD�H��H���
���H��[]A\�DH�5�==���t�=���H�5>H��=HD��f�D�g(D��脑��E��H��H��H��H�>1��
���H��[]A\�f�H�5=�|���@UH��SH��H���z���H�;H�(H�@tH�SH�BH�CH��[]�fDH�CH�H��[]�f��G��t	��UHc�SH��H��H�oH�����H�MXH��H�{H��H��H�q(HD�H��[]�b���f�USH��H���������1�1��@H���DL�A��t8L��A��A��A��<t�<&����t�<"H�FL�A�„�HE��D��u�H��tsH�t�x����H�Ƅ�u?�W@��>ts��&t~������"�}�t;�&quoH��f�V�H�����t��<u�H���&lt;H�����u��H��H��H��[]�DH���+�����&gt;H���@�&ampH���F�;떈H����ATI��UH��SH�^H��tDH�31�H�����H�H�[H��u�I�\$(H��tDH�31�H���Ӎ��H�H�[H��u�I�\$PH��t#DH�s�H��觍��H�CH�[H��u�I�\$HH��tH��H���e���H�[@H��u�[]A\��AWL�yAVA��L��AUI��D��ATUH��L��SH�YH��H��(L�L$L�D$�6�H��L�XI��L��L�\$迈��L�T$I��L��D��L��H��H��M���@���H�D$H�|$`B�D%H�(t
H�D$`L�\$L�H��([]A\A]A^A_�ff.��VH����tH�5�91��Nj���H��H�5�91�鯋��ff.�@AVAUATUS�>t]HcGI��I���X�H�,�����@I�FL���H�4(H��葉����tA�܃��u�L���]���E�fL�(A��[D��]A\A]A^�A�������ff.�AT�0UH��S菇��f�H��H��H�h@@ �l���f�H���I��H�荀��H�5�9I�D$H�H�x���1�����H�C H��teH�
N� H���H��H���L���H�{ H����H�{ H�5�H�5.蹍��H�{ H�5�����9���H�{ H�5.����H��[]A\ÐH��1�薃�������ff.�f�AWI��AVAUI��ATM��UH��SH��H�����H�EH����H��L��L�t$�a���L�d$H���!�H�T$H�}H��������uL�d$L��H��L���ȇ����t�=~tH��[]A\A]A^A_�fDH�}L�����H�EH��[]A\A]A^A_�DH���.N[]A\A]A^A_�ff.���G��t	��AWAVAUI��ATUH��SH��pH��H�苅��H��H�xH��I��H�H��H�@h1�H)���p���H�H�}����I�$I�}H�D$�CH�}� I���.���I�u�H�}H���އ��H�}H�I�u��·��I�L$PH�CI�}H�KH��I�\$Pu�H�EH����H�PXI�D$8H����L�b@L�`XL�eI��E1�M����I��H�5)7H���0�������C<:������H�CI�wH�$H�}��ʈ��H�}�I���Y���f�L��H��H�@H�$H�H�EH�x���C1�A�>���CI�D$`H�CI�\$`M����I�GI�EM�M���>���I�|$��H�|$�:�
���H��H����I�$����<X���B���<M���B���<L��A�D$����DI�\$PH��u"�s@A�E���<Lu@�C����H�[H��tSL�+�:L��脁��I��H��t�A�E���<XuA�E���<Mt�A�$H�}I��H�3��L�#�C���}��EH��[]A\A]A^A_�f��H�}H��I�4$���I�$A�D$����J������H�5A5H���q�����t-M��M����I�w�>��H�CH�$����fDI�wH�}��ކ��I�D$M���f���M�M�|$P���f�H�EL� L�e���I�D$8H���Y���H�@I�D$�K���@L�`XL�`H�X���H�}H�5�!���A�D$�y����E������I�L$P����H�G1�H�8H��8��ff.�H��hH�Gf�E1�H�4$H�L$01�H��T$H��D$H�D$H���D$$)D$0)D$@H�D$P��x����H��h���ff.�f�ATf�USH��`H�L�gD$H�$H�FH�D$�D$I�D$�D$$)D$0)D$@H�D$PH��tnH��H��H�T$0H��H����=�t+H�$�D$H�E1�H�U�CH�CH��`[]A\ÐI�D$H����1�1�I�D$�H��`�[]A\�f��ff.�@UH��SH��H���/���H�EH�H��[]�ff.�f�AW�B�AVAUA�ATUSH��(H���vH��(D��[]A\A]A^A_�H��2I��H��1�L�t$D�<�1�L��L���L$����A�Ņ�tA�����H�D$�|$L����#���H��L��E��PA�H�|$ 1�1�A��A��XZE��tH�D$1�H���8�f.��(H��H�D$�j��f�L��H��I�ĺ@H�H�(H��� I�D$ �y��I�D$����Uf�1�SH��H��8H�GH�4$1�H��T$H��D$H�D$H���D$$��P��u�C1�H�CH��8��[]ÉŁ��t܉k��謄��H�CH��8��[]�ff.�@ATf�I��1�U1�SH��H��`H�o)$H�E)D$H�UH�D$ )D$0H��)D$@H�D$P��H��t<H�$�L$I�$I�L$�Ł��ua�C1�H�CH��`��[]A\�DH�EH�T$0H��H����f�=�t;H�$�L$I�$I�L$��t��@�k��趃��H�CH��`��[]A\��)$)D$H�D$ H�EH����H�$H�EI�$�D$I�D$�B���Uf�H��E1�SH��H��hH�GH�4$H�L$01�H��T$H��D$H�D$H���D$$)D$0)D$@H�D$P��x=�t[H�T$0�|$8H�UH�}��u�C1�H�CH��h��[]�@�Ł��t؉k��贂��H�CH��h��[]��H�EH�E�ff.�Uf�SH��H��hH�GH�4$1�H��T$H��H�L$0H�L$0D�D$8H��E1�D$H�D$�D$$D$<H�D$L�D$T����u$�C1�H�CH��h��[]�f.��Ł��t҉k���܁��H�CH��h��[]���H��H���EOSFILEFLUSHHEAPMMAPPIPEPOOLTRANSIENTIMMORTALSOCKETapr_crypto_%s-1.soapr_crypto_%s_driver$apr1$./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz�{SHA}$2y$N��H��<��0��$��������B�<�0�$������������������8b �������34����345VUrPmXD6q/nVSSp7pNDhCR9071IfIReUi1D709vfamulimlGcq0qq3UvuUasvEaU@@@@@@@@@@@@@@6789:;<=>?@@@@@@@	

@@@@@@ !"#$%&'()*+,-./012345@@@@@./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789�1Ѭ�ߘ�r�/����Ḗ~&jE�|��,�G��$�l�������� iciNWq��X�~=��t�
X��rX͋q�J��T{�YZ�9�0�`�*#����`(yA��8۸��y�:`��l>���w�'K1��/�x`\`U�%U攫U�b�HW@�cj9�U��*4\̴��A��T���r|�*�oc]ũ+�1t>\����3�֯\�$l�S2zw��(�H�;��Kk�ē!(f�	�a��!�`�|H2��]]]��u��#&܈e�>�#Ŭ���om9B�D. ��J��i^��Bh�!�l�a�g�ӫҠQjh/T�(���3Q�l�n�;zP�;��*�~e�v�9>Y�f�C���oEå�}�^�;�uo�s ���D@�j�Vb��Nw?6r�=�B$��7H
���ۛ��I�rS{���y�%���P��;Ly���l����O���`�@ž\^c$j�o�h�Sl>�9o�R;Q�m,�0�DE��	�^���J3�(f�K.W��t�E9_��ӹ��yU
2`���yr,@�%�g̣��饎�"2��u<ka��P/�R���=2`�#�H{1S��>�W\���o�.V��i��B��~(�2g�sUO��'[i�Xʻ]����=���!�l��J[��-y�S�eE���I�Ґ��K����3~ˤA�b������ �Lw6��~д�+M�ە����q���Փk�ю��%ǯ/[<���u���d+�����
��^�OÏh���ѭ���"//w��-u��̠��to�������O������;�|٨��f�_w��s̓w!e ���w�BT��5����렉>{�A�I~�-%^�q �h"��W�6d$�	��cU���Y�C�xSZ٢[} Ź�v&��ϕbh�AJsN�-G�J�{RQ)S�?W��ƛ�v�`+t恵o��Wk���
*!ec�����.4�dV��]-�S�����G�j�n�pzKD)��.	u�#&İ�n�}ߧI�`�f��q����ilRdVឱ¥6)L	u@Y�>:䚘T?e�B[��k�?���ҡ�0���8-M�]%� �L&�p���c^�?kh	��>�<�pjk�5h��RS��7P��>\���D}���W7�:�
P�����t�<Xz�%�!	���/�|sG2�G�"���:���74v�ȧ��FaD��>���Au���8�/�;���21�>8�TN�mO
Bo�
���,y|�$r�yV����w�������.?��rU$qk.��P�̈́�GXz�t�����}K�:�z���fC	c��d�G��27;C���$CM�Q�e*�P��:���qUN1�w���_�V5kǣ�;<	�$Y����,���n<pEㆱo��
^��*>Z�w�=N��e)�։>�%�fRx�L.j����x��S<���-
�N��=+6&9`y��#R��n���f��E���{��7�(����2åZl��!Xe��h���;�/ۭ}�*�/n[(�!pa)uG���a0����a��4�c��\s�9�pL���ު˼���,b`�\��n���d���i#�P�Ze2Zh@��*<��1��!�T���_�~����}=b��7�w-�_���h)�5��ǡ�ޖ��Xx���Wcr"�Ã��F��
��T0.S�Hُ(1�m���X��4a�(�s<|��J]�d�]B�> ���Eꫪ�Ol��O�B�Bǵ�j�;Oe!�A�y��M��jGK�Pb�=�b�F&�[��������$�t�i��G���V�[	�H�t�b�#*�BX�U>�ap?#��r3A~����_��;"lY7�|`t�˧�@n2w΄���P�U���5��a��i����Z���.zD��4E�g�ɞ��s�͈Uy�_g@Cg�e4���8>q��(= �m��!>J=��+�����hZ=�@��&L�4)i�� A��v.k�h��q$�j� 3�ԷC�aP.�9FE$�tO!@�����M�������pE/�f�	������m���1�'�A9�U�G%ښ
ʫ%xP(�)Sچ,
�m��b�hiHפ�h'��?O��������z|Ϊ�_7ә�x�B*k@5�� ���٫�9�N;���VmK1f�&����t�n:2C[��Ah� x�N�
����جV@E'�H�::SU��� ��k�K��мg�UX��c)��3��VJ*��%1?~�^|1)��p/'\���,(H��"m��?�H܆���A�yG@n�]�Q_2��Տ���d5A4x{%`�*`���lc´�2��Of�����#k�>3b$;"�������
��r�(��-Ex����b}d���o�IT�H}�'����>�AcG
t�.��no:7���`�����L��
kn�U{�7,gm;�e'����
)�̒9��i��{f�}��ϑ��^و/�$�[Q�y�{��;v�.97yY̗�&�-1.�Bh;+j��Lu�.x7Bj�Q��满Pc�Kk���ؽ%=����YBD�
n��*��Ng�d_��ڈ鿾���dW�������{x`M``F��Ѱ8��Ew�6�3kB�q��A��_^<�W�w$�轙BFUa.X���XN����8�t�½���fSt���U�u���Fa&�z���yj��_��YnFpW� �UՌL�������Hb���tu��	ܩ�	-f3F2�Z茾�	%��J�n=�ߤ��i�h(�ڷ�9W���R�O^P���ĵ�'��
'���A�?wL`õ�a(z����X`b}�0מ�c�8#���S4��V�˻޶���}��vY�	�o�|K=
r9$|�|_rㆹ�Mr�[�����xUT���|=���M^�P��a����<Ql���o�N�Vο*67���42���c���g�`@7�9:���7w«-�Z�g�\B7�O@'�Ӿ������s�~-�{��k��E��!��n��n6j/�HWyn���v����Ie�S}ލF
s��M�Lۻ9)PF���&���^�����Q-j��c"�‰��.$C�����a��Mj�P��[d���&(�::����K�bU���/��R�io?Y
�w�������	���>;Z����4�ٷ�,Q�+:�Ֆ}�}�>��(-}|�%����r��ZL��Zq�)����G��������W;()f�(.y�_xU`u�D���^���m�m�%a���d��âW�<�'�*:��m?�!c�f����&(�3u��U��4V�<��wQ(��
�gQ̫_���Q�M��08bX�7�� �z��{>�d�!Q2�Ow~㶨F=)�iS�H��d��$�m�-�if!	
F���Ed��lX�� ��[@�X�̻�k~j��E�Y:D
5>�ʹ����r��d��f�Go<�c�Ҟ]/Tw®pcN��
tW[�qr�]}S��@@��NjF�4��(��:�����H�n΂;?o�� 5K�'r'�`a�?��+y:��%E4�9��Ky�Q��2/ɺ�~���Ǽ��Ǫ�I����O�����8�
�*�9g6��|1��O+��Y��:��C���E�',"��*��q��%��a��뜶�Yd��Ѩ�^��j�eP�B��n��;ۘ���Ld�x22��ߒ��+4���q�At
�4�K q���2vÍ�5�./��Go���T�L����yb�o~>�f�,��ҏ��"��W�#�#v2�15����Vb���uZ�6n�s҈�b���I���PLV�q����
z2��E�{��S���b�%��ҽ5iq"�|�˶+�v�>S��@`��8�G%� 8�v�F�š�w``u N�˅؍芰��z~��L\�H����j�����i�Ԑ��\�-%	?���2aN�[�w��ߏW�r�:�j?$���.�Dsp"8	��1�)��.�lN��!(Ew�8�fT�l�4�)���P|ɵՄ?	G�����y�hprOBnaeloheSredDyrctbuo$2a$00$abcdefghiUUUUUUUUUUUUUUUU%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02xapr_dbd_%s-1.soapr_dbd_%s_driver�����������������������������������H��������������������������������������������������������������������������������������{����������������������l��defaultdbsdbm.dir.pag%pm�?�������?���������������?�����������������������?������h��p��������������`��encoding/apr_base64.cnprbytes <= APR_BASE64_DECODE_MAXlen >= 0 && len <= APR_BASE64_ENCODE_MAXapr_base64_encode_binaryapr_base64_encode_lenapr_base64_decode_binaryapr_base64_decode_lenABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@?456789:;<=@@@@@@@	

@@@@@@ !"#$%&'()*+,-./0123@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@hooks/apr_hooks.ck < nItemsi < nItemsSorting %s:n < pHooks->nelts  Hooked %s pre( succ(tsortsort_hookapr__ldap_fnsapr_ldap-1.soURL:ldap://ldapldaps://ldapsldapi://ldapi,Bad LDAP URL while parsing.oneonetreebasesubsubtreeEither the LDAP URL, or the URL structure was NULL. Oops.The scheme was not recognised as a valid LDAP URL scheme.Out of memory parsing LDAP URL.Bad enclosure error while parsing LDAP URL.Bad LDAP URL while parsing IPV6 syntax.Bad attributes encountered while parsing LDAP URL.Bad scope encountered while parsing LDAP URL.Bad filter encountered while parsing LDAP URL.Bad URL encountered while parsing LDAP URL.Bad extensions encountered while parsing LDAP URL.quit:.version %u %u %lu 
NOT_STORED
 %u
ERRORNOT_FOUNDadd replace VALUEENDdelete DELETEDincr decr VERSIONstatsSTATSTAT version STAT pid STAT uptime STAT pointer_size STAT time STAT rusage_user STAT rusage_system STAT curr_items STAT total_items STAT bytes STAT curr_connections STAT total_connections STAT connection_structures STAT cmd_get STAT cmd_set STAT get_hits STAT get_misses STAT evictions STAT bytes_read STAT bytes_written STAT limit_maxbytes STAT threads �0w,a�Q	��m��jp5�c飕d�2�����y����җ+L�	�|�~-����d�� �jHq���A��}�����mQ���DžӃV�l��kdz�b���e�O\�lcc=��
�� n;^iL�A`�rqg���<G�K��
�k�
����5l��B�ɻ�@����l�2u\�E�
��Y=ѫ�0�&:�Q�Q��aп��!#ijV���������(�_���$���|o/LhX�a�=-f��A�vq�� Ҙ*��q���俟3Ը��x4���	���
j-=m�ld�\c��Qkkbal�0e�Nb��l{����W���ٰeP�긾�|�����bI-��|ӌeL�Xa�M�Q�:t���0��A��Jו�=m�Ѥ����j�iC��n4F�g�и`�s-D�3_L
��|
�<qP�A'�� �%�hW��o 	�f���a���^���)"����=�Y�
�.;\���l�� �������ұt9G��wҝ&���sc�;d�>jm
�Zjz��	�'�
��}D��ң�h���i]Wb��ge�q6l�knv��+ӉZz��J�go߹��ホC��Վ�`���~�ѡ���8R��O�g��gW����?K6�H�+
�L
��J6`zA��`�U�g��n1y�iF��a��f���o%6�hR�w�G��"/&U�;��(���Z�+j�\����1�е���,��[��d�&�c윣ju
�m�	�?6�grW�J��z��+�{8���Ғ
�����|!����ӆB����hn�����[&���w�owG��Z�pj��;f\��e�i�b��kaE�lx�
���
�T�N³9a&g��`�MGiI�wn>JjѮ�Z��f�@�;�7S���Ş��ϲG�0򽽊º�0��S���$6к���)W�T�g�#.zf��Ja�h]�+o*7������Z��-## @$$ #### ##:##:## *##-@$$-## ##:##:## *@$$ ~# ##:##:## ####*## @$$ ## ##:##:## * # @$$ ## ##:##:## *## @$$ ## ##:## *## @$$ ## #:##:## * # @$$ #### ##:##:## *##-@$$-#### ##:##:## *naJbeFraMrpAyaMnuJluJguApeStcOvoNceDmisc/apr_reslist.crl->nidle == 0rl->ntotal == 0reslist_cleanupmisc/apr_thread_pool.ctask != NULLapr_thread_pool_taskNULL == elt->current_owneri + 1 == ntask != APR_RING_SENTINEL(me->scheduled_tasks, apr_thread_pool_task, link)task != APR_RING_SENTINEL(me->tasks, apr_thread_pool_task, link)APR_RING_SENTINEL(me->tasks, apr_thread_pool_task, link) != me->task_idx[seg]!apr_os_thread_equal(apr_os_thread_current(), *os_thread)stop_threadswait_on_busy_threadsadd_if_emptywaiting_timepop_taskthread_pool_funcLD_LIBRARY_PATHapr-util-1//opt/cpanel/ea-apr16/lib64/apr-util-11.6.3*1
$4
QUIT
PING
+PONG*3
$3
SET
$%lu
+OK
$-1
*4
$5
SETEX
*2
GET
$-1DEL
:1:0INCR
DECR
INCRBY
DECRBY
$6
$%d
INFO
redis_version:%d.%d.%dprocess_id:uptime_in_seconds:arch_bits:connected_clients:blocked_clients:maxmemory:used_memory:total_system_memory:total_connections_received:total_commands_processed:rejected_connections:total_net_input_bytes:total_net_output_bytes:keyspace_hits:keyspace_misses:connected_slaves:used_cpu_sys:used_cpu_user:cluster_enabled:role:master�0w,a�Q	��m��jp5�c飕d�2�����y����җ+L�	�|�~-����d�� �jHq���A��}�����mQ���DžӃV�l��kdz�b���e�O\�lcc=��
�� n;^iL�A`�rqg���<G�K��
�k�
����5l��B�ɻ�@����l�2u\�E�
��Y=ѫ�0�&:�Q�Q��aп��!#ijV���������(�_���$���|o/LhX�a�=-f��A�vq�� Ҙ*��q���俟3Ը��x4���	���
j-=m�ld�\c��Qkkbal�0e�Nb��l{����W���ٰeP�긾�|�����bI-��|ӌeL�Xa�M�Q�:t���0��A��Jו�=m�Ѥ����j�iC��n4F�g�и`�s-D�3_L
��|
�<qP�A'�� �%�hW��o 	�f���a���^���)"����=�Y�
�.;\���l�� �������ұt9G��wҝ&���sc�;d�>jm
�Zjz��	�'�
��}D��ң�h���i]Wb��ge�q6l�knv��+ӉZz��J�go߹��ホC��Վ�`���~�ѡ���8R��O�g��gW����?K6�H�+
�L
��J6`zA��`�U�g��n1y�iF��a��f���o%6�hR�w�G��"/&U�;��(���Z�+j�\����1�е���,��[��d�&�c윣ju
�m�	�?6�grW�J��z��+�{8���Ғ
�����|!����ӆB����hn�����[&���w�owG��Z�pj��;f\��e�i�b��kaE�lx�
���
�T�N³9a&g��`�MGiI�wn>JjѮ�Z��f�@�;�7S���Ş��ϲG�0򽽊º�0��S���$6к���)W�T�g�#.zf��Ja�h]�+o*7������Z��-@][#?XXXXXXXXhttpftphttpsgophernntpsnewsimappopsiprtspwaisz39.50rz39.50sprosperonfstipacaptelnetssh�<%s<%s:%s<ns%d:%s %s="%s" %s:%s="%s" ns%d:%s="%s" xml:lang="%s" xmlns:ns%d="%s" xmlns%s%s="%s"</%s></%s:%s></ns%d:%s>No error.The parser is not active.<%s/>
<ns%d:%s/>
An undefined namespace prefix was used.A namespace prefix was defined with an empty URI.There was an unknown error within the XML body.XML parser error code: %s (%d)DAV:xml:langxmlns;�
�F��X��<�X��(@Y��TPY��hpY����Y���PZ���`Z����[���@\���]��Dp]��|p^����_��D�a����a���0b����f��L�g����g���ph���i�� �i��<�i��X�i��l�i���j���j��� j���@j����j���k��P0k��l`k���0l���`l����l����l����l���m��h�m���Pp����p�� q��L0q��`�q����q����q���r��� r���Pr��s��Xps����s����s���0t����t��4Pu����u����u��� v���w��`�w��t x���px���y���`y��(�y��D�y��`�y��t�y����y���@z���pz����z���z��@{��H`{��\�{����{��� |����}���}��$ ~��P`~��|p~����~����~����~����$���8���L ���`0���t@����P����`����p��������������������������(Ё��<��P�h@�����������0�������h0���������Ћ���Г��@ ����� ����� �� ���� ���� !���X!�����!����!����8"p���|"�����"�����"�����"p���<#�x#�����#���#`����#����$����$����8$`���L$`����$�����$����$ ��%@��X%`���%����%0���%���&���8&���L&���`&���t&����& �'p�<'��d'��x'���'���'���'��'��'0��'P�(p�(��,(��@(��T(��h(��|(���(���(��)��)P��)p��)���)0��)���)��*�*��0*0�L*P�`*���*P��*p��*��+��+��,+��@+��T+��h+��|+���+0��+���+���+��,��$, �\,p��,���, ��,��-�,-`�T-p�h-�-@��-�� .��l.��.@��.����/0���h/P���|/����/����0����@0���T0�����00���1`��� 10���T1p���h1����1@����1����2��(2P��@2���T2����2���2���3���3P��@3p��\3���p3���3 ���30���3����3�
��84��L4��x4`���4���5���D50��p5����5���5���6���@6��T6����6���6`���6���7��07���D7����7����70���7���8���88����8@ ��9� ��09 !��P9�!���90"���9�"��:$��l:@$���:&���:0&���:�&�� ;�&��4;�&��P;�'���;�(��<@)��H<�)��\<�)��t<�)���<�+���<�-�� =�-��@= .��`=P.���=�1���=`3��>�3��,>�3��@>�4���>p5���>�?���?0G��@�H��X@ L���@U���@@U���@ V��@AW��|A�W���A�W���A�X��B`Y��DB�Y��dB�Y���B�Z���BP[���B]��<C`^���C�^���C�`���Ca��Da��,D@a��TD�a��|D�a���D�b���D�d���Dpf��lE�g���E@h���EPh���E`i�� F�j��\F@l���FPl���F`l���Fm��LG m��`G�r���GPs���Gt��$H�v��pH x���HP{���H�{��I�{��(I�}��tI�}���I����I����I����I���J���J���0J���DJ���XJ���lJ ����J0����J@����J�����J�����J�����Jp���4K��TK�hK���|KP����Kp����K�����K�����K����L ���`L@���tLP����LІ���L@����L�����L���\M@���pM�����M�����M��M0���(N@����N�����N����N ���O@���O`���dO@����Op����O�P��\P����P����P����DQ����Q`���R���� R����4R����HR����R ����R�����R ��� S@���pS�����S����T����\TЮ���T�����T�����T`���`Up���tU`����U�����U�����U�����Uг���U�V@���DV����|V����V���W`���8W���tW����W ���Wp��X���<XP��hX���X@���X���Y���4Y����Yp���Y���Z��$Z���dZ���xZ���Z0���Z���,[���p[����[zRx�$�7��FJw�?;*3$"(D�J��RB�E�A �DCBp�J����J��A�Y(��J��KB�I�D �xAB,�K���B�D�D �`
ABC�hK���dK��(Q�E�E �B(�A0�E8�DP8A0A(B BBBH������PP������W8A0A(B BBBG������PP������G
8F0A(B BBBJH��K���B�B�F �B(�A0�A8�D`r
8A0A(B BBBB\TL���B�F�B �B(�D0�A8�Dp�
8A0A(B BBBAK8C0A(B BBB4`�L��`B�E�I �D(�G@~(A ABB`��L���B�B�B �B(�A0�A8�Hp�
8A0A(B BBBAQ
8A0A(B BBBB`��M��rB�H�E �F(�D0�A8�GP�
8C0A(B BBBDf
8D0A(B BBBEL`�N���B�B�B �B(�A0�A8�H�&
8D0A(B BBBK�$P��D X�,P��GA�x
GF|�\P���B�E�B �B(�A0�A8�K��
8J0A(B BBBIx
8A0A(B BBBF�
8A0A(B BBBFHhlT���B�E�B �E(�D0�A8�G�n
8A0A(B BBBF4�U��<B�E�D �G(�G0I(G JBB�U���G��0|U���B�J�D �G�?m AAB<�U���G�}XLV��5A�stpV���lV���hV���dV���`V���XV��DS�`V��DA�y
F(�V��aA�D�D u
DAAzRx� �� �C��l�V��)A�c��V��*TQ(��V���A�D�H b
AAG�xW��-��W����W��'�W��0A�jT,�W���B�E�B �D(�C0�D@I
0C(A BBBIf
0C(A BBBH�`X��A�M
BDH�`X��RB�B�B �E(�D0�A8�Dp�
8D0A(B BBBA8�tZ��aB�E�E �D(�D0�E(A BBB8,�Z��VB�E�E �G(�I0�n(A BBBh�Z��
4|�Z��HA�A�D Y
CAE[CA��Z����Z��'�[��0A�j�[��	$[��"A�W
HA@0	4[���B�E�E �D(�D0�D@A
0A(A BBBG4t	�[��TB�E�G �I(�G0k(A ABB�	�[��0�	�[��VO�G�D �G0g AABD����	\��BA�t
KA8
0\��hB�E�E �D(�D0�L(A BBBhP
d\���B�B�B �A(�A0�D@g
0D(A BBBBz
0D(A BBBKD0G(D BBB4�
�\��TB�E�G �I(�G0k(A ABB�
�\��"$�\��=A�I�G eAAH0]��B�E�B �B(�D0�D8�DP�
8C0A(B BBBF|8^��1�d^��9A�w ��^��LH�MK�P�W�8��^���B�E�E �D(�D0�q(D BBB4_��TB�E�G �I(�G0k(A ABBD0_��A�Q`4_��A�O|8_��	�4_���@_��$�L_��IA�D�G xCA�t_��%D](��_��VG�D�G0sCAG��$
�_��(8
�_��BB�G�I �hABd
�_��(x
�_��BB�G�I �hAB�
 `��"$�
<`��=A�I�G eAAH�
T`��ZB�E�B �B(�D0�D8�DP{
8C0A(B BBBB,ha��(@da���Q�D�D e
CAF(l�a��>B�I�D �iCB��a��
��a��DK��a��#A�a��a��6H�b���B�B�B �E(�D0�D8�G�\
8D0A(B BBBE@�c��T�c��h�c��|�c����c����c��
��c����c����c����c���c���c��0�c��D�c��X�c��l�c����c��BA�@H��c��~B�E�B �B(�A0�A8�D�b8A0A(B BBB��h��.0i��<A�D�J0^
AAADFAL4i��NB�G�H �B(�A0�D8�I�I
8C0A(B BBBJ0�k���B�I�A �K0�
 AABC8��k��FB�E�D �D(�D�l(A ABB��k��BA�@H�k���B�B�B �B(�A0�A8�DH�
8A0A(B BBBEL\�s���B�N�B �E(�D0�E8�D��
8C0A(B BBBF��u��.0�v��<A�D�J0^
AAADFA�v��0v���B�I�A �K0�
 AABC4<�v��FB�E�D �D(�D�l(A ABBLt�v��~B�B�B �B(�K0�A8�J�6
8C0A(B BBBA@��{��uB�A�D �J�w
 AABDd
 AABHH}��tB�M�D �K(�D`l
(C ABBJK(A ADB@T@}���B�F�B �A(�A0�G��0A(A BBB���3H�����B�N�F �E(�A0�C8�DP|
8A0A(B BBBA�����H�����B�B�B �B(�D0�D8�H@�
8A0A(B BBBA8X,���yB�E�D �A(�J�\(A ABB0�p����L�V�D �H(�� AEE����A�[����wD�Vt���A�Ux���K��8l���A�UTp����@h����B�L�E �I(�E0�G8��0D(V BBB�Ȗ��!L���DB�B�B �B(�A0�A8�G�"�
8A0A(B BBBA��6L$���B�B�B �E(�F0�D8�P�d
8D0A(B BBBJ,t�� A�D �
DDT
CI$��eA�G �
AF����S8�d���dDLE E(E0E8E@EHEPEXE`EhEp\4����A�D�G C
AAG�CAT����h|���|x���4�t����A�K�D �
CAGj
CAJT�<���$B�B�B �D(�D0�D�O
0C(A BBBEh
0C(A BBBF4 ���NB�B�D �J(�J0h(D ABB$X,���*A�G�J QDA�4����0����<���	�8����4���	�0����,���8��� D���4P���	HL���	\H���pT����P����\���X�X����B�E�D �J(�J0i
(C ABBHg
(F ABBFD(F ABB��������t0�����B�B�B �B(�A0�A8�D���D�]�A�D
8A0A(B BBBF4
8F0A(B BBBE������Ⱦ�� �Ծ���G���X����J��̿��ؿ�� 0���G��Lh����J��h���8|���B�B�A �D(�N0e
(D ABBK<�L���VB�E�E �D(�D0�G@r0A(A BBB�l���x��� t���4p���Hl���\h���pd����`����\����X���8A�e
JG4�x���LB�E�D �D(�GPo(A ABB��������,����4@����OB�N�F �D(�G0g(A ABB$x����AA�D�G0rAA0���uA�D�G@w
AAKbAA�0��/D j0�H��uA�I�J@w
AACbAA$ ���TA�I `
AEbA$H���\A�R `
ADbAp��	<����B�D�A �I0P
 CABJW CAB�P��;A�f
IX�t���B�E�D �F(�G@d
(A ABBFm
(A ABBEX(A ABBH< ����B�E�E �E(�A0�A8�DP$
8C0A(B BBBI(� ��\B�E�D �MAB0� P��IA�J�G0Z
AABVAAL� l��\B�F�B �E(�E0�A8�J�	�
8D0A(B BBBBH8!|���B�N�B �H(�F0�D8�GP�
8D0A(B BBBE�!���\�!����D�I�E �D(�A0�f
(A BBBDn
(A BBBCH
(A BBBA4�!��vB�I�D �N
ABHe
ABH(0"d��6B�I�D �cAB\"x��Lp"t���D�H�E �C(�A0�Z
(A BBBJH
(A BBBA`�"����`�B�E �E(�D0�D8�G`�8C0A(B BBBK������P`������$# ��'0<#8���B�C�I �G�b
 CABCp#���6H�#���B�B�B �B(�A0�A8�DPl
8D0A(B BBBI�#T��#8�#p��jB�B�E �D(�D0�L(F BBB  $���_K�k
JHH�D$���3NX\$��GHp$D���B�B�B �B(�A0�A8�DP�
8A0A(B BBBFH�$���VB�J�E �E(�D0�A8�G�)8A0A(B BBB%���%���\}(0%���TA�K�D 
DAJ\%��A�Px%��>_�%8��XA�
H�%x���%p��(�%l��UA�D�G \
AAFL&���
B�B�B �B(�A0�A8�D�#
8A0A(B BBBET&`��e(h&���B�C�N ��FB0�&���IA�A�D n
AAJDCA`�&���#B�B�E �E(�D0�D8�GPC
8A0A(B BBBFD
8J0A(B BBBI0,'x��9A�A�D X
GDGDCA(`'���SB�D�D �a
ABJ0�'���eA�D�D0T
CAGxCA0�'���ZA�G S
DId
ABDF0�' ��A�G0T
DHI
ABDF0((l��mA�G0T
DHw
ABDF\(���0p(���uA�G0T
DH
ABDF0�(��uA�G0T
DH
ABDF$�(L��GH�P
HT
LF0)t��sA�G0T
DHy
AFDF4)���L)����L`)d���J�F�G �
AAFS
AACS
AAKDCAH��H�)��2B�B�B �B(�A0�D8�D`�
8A0A(B BBBF�)�3I Y*0�SI u
JF4*p�SI u
JF�T*���B�B�E �E(�D0�I8�D`�
8C0A(B BBBFZ
8A0A(B BBBDk
8F0A(B BBBFm
8F0A(B BBBDU
8F0A(B BBBD+�BA�l
C$$+0�dA�N ^
ABrAL+x�dA�S@LCLl+���B�D�D �D0J
 CABBD
 CCBDS ACB(�+�uB�A�A �mAB<�+\��B�A�A �D0~
 CABDh MAB\(,��GB�E�G �A(�F`c
(A ABBB�
(A ABBG@(A ABB�,��+L�,���B�G�B �E(�A0�A8�D�r
8D0A(B BBBK�,(�,8-D�YB�B�B �A(�A0�F(D BBB<-h�P-t�*A�hHl-���B�B�B �B(�D0�C8�F`�
8A0A(B BBBEl�-<��B�J�H �E(�D0�E8�D`T
8A0A(B BBBDDhPpOxA�Q`f8A0A(B BBB8(.��oB�E�J �D(�A0�Q(A BBBd.��Cx.,�DI�.4�H�.@�B�B�B �E(�A0�G8�J�r
8C0A(B BBBEH�.��B�B�B �B(�A0�G8�G�a
8D0A(B BBBK</��+DFO Q\/��+DFO Q|/��+DFO QH�/��SB�B�B �B(�D0�G8�G�i
8D0A(B BBBHH�/��B�B�B �H(�D0�A8�D�V
8C0A(B BBBG40@���H0L���l\0X���7B�E�E �A(�D0�D`Y
0C(A BBBH�
0C(A BBBFQ
0C(A BBBE<�0(����B�B�E �G(�D0�U
(A BBBH�1x���{
B�E�E �B(�A0�A8�G��K�K�G�^��
8A0A(B BBBIn�K�H�B�^�x�K�E�B�^�S�F�C�C�Z�}�B�A�E�Q���E�D�E�M�H�1,��;B�B�B �B(�D0�D8�G�\
8D0A(B BBBHL$2 ��IB�E�D �A(�F0_
(A ABBI�
(A ABBF<t2 ���K�A�D �D`r AABF���H`���<�2����J�A�G`l
AAH���C`���20��#A�aH3D���B�B�J �D(�G0�d
(C BBBJ�(C BBB8\3����B�A�A �i
ABHp
ABE8�3����B�A�A �c
ABFH
ABE�3���8�3����B�A�A �T
ABEb
ABK8$4����B�A�A �g
ABJH
ABE`4��4A�Q
FW �44��5A�Q
FX8�4P��B�B�A �A(�G0�
(D ABBD�4$��Qt\\�4l���B�B�B �A(�A0�U
(D BBBIJ
(D BBBDf(D BBBHX5���JB�B�B �B(�A0�A8�DP#
8C0A(B BBBC�5���H�5����B�B�B �B(�D0�A8�G@�
8D0A(B BBBD,6���{B�D�A �X
ABN46���$H6���*A�A�G \CA$p6���CA�D�G rCA0�6��`A�M�G [
KALGKA�68����6���@��6����B�E�E �D(�A0�G@{
0A(A BBBE�
0A(A BBBLD
0C(A BBBBh
0A(A BBBHx0A(A BBB0�7� ��JA�p
G�
MC
Em
KU8�7"��uB�E�D �D(�G@A
(C ABBA�7\"��,8X"��B�D�A �p
ABF8<88#��.B�B�D �E(�L0h
(D ABBFpx8,$���L�A�D ��
ABGy
CBJP���P ���e
�A�B�H]
�A�B�H]�A�B��8h%��9d%��P9`%���K�B�B �D(�A0�N
(D BBBD`(D BBBF�����h9�%��H|9�%��dB�B�B �E(�A0�A8�G@
8C0A(B BBBA@�9�*���B�D�D �D@F
 DABEP
 DABI0:X+���U�A�D �D0v AABH���H@:�+���B�E�E �E(�D0�C8�D`@
8C0A(B BBBH8�:x.��0B�D�D ��
ABNa
IBDH�:l/��-B�B�E �E(�D0�I8�DPj
8D0A(B BBBJ;P2��"A�`0;d2��HD;p2���B�E�E �E(�D0�A8�GP�
8C0A(B BBBD�;4��@�;4���B�B�B �D(�D0�D@�
0C(A BBBJ�;�5���;�5��<�5��$<�5��8<�5��L<�5��`<�5��t<�5���<�5���<�5���<�5��$�<�5��_A�L a
AAmA�<�5��	=�5��8=�5���B�B�A �C(�D@o
(D ABBDP=46��eA�J
Ep=�6���=�6��	 �=|6��NA�Q c
AJ�=�6���=�6���=�6��4�=�6���A�K�D �
CAGr
CAJH0>t7���B�E�L �E(�A0�A8�J�!w
8D0A(B BBBH|>�9���>�9���>�9��yA�SPaC$�> :��dA�N ^
ABrA(�>h:��uB�A�A �mAB\?�:��NB�E�G �A(�F`c
(A ABBB�
(A ABBGG(A ABBx?�;��+8�?�;��YB�B�B �A(�A0�F(D BBB�?�;���?�;��*A�hH�?<��=B�B�E �E(�K0�D8�GpY
8D0A(B BBBFlD@=��B�J�H �E(�D0�E8�D`j
8A0A(B BBBFDhPpOxA�Q`f8A0A(B BBB8�@�=��oB�E�J �D(�A0�Q(A BBB�@�=��CA>��DIA>��L0A$>��B�A�D �D`[
 CABD�
 CABFR CABH�A�>���B�T�B �A(�A0��
(A BBBIF(A BBB�A�?��,H�A�?��zB�B�E �B(�G0�D8�G�^
8C0A(B BBBIH,B�A���B�B�B �E(�A0�G8�J�e
8D0A(B BBBAHxB|D��#B�B�B �B(�A0�D8�M�e
8D0A(B BBBDH�B`F���B�B�B �H(�D0�A8�G�S
8C0A(B BBBGLCH���B�B�E �B(�G0�D8�G�3
8D0A(B BBBCl`CtK��<B�E�E �A(�D0�D�[
0C(A BBBF�
0C(A BBBBR
0C(A BBBDT�CDL��_B�B�B �D(�D0�G@c
0D(A BBBE�
0D(A BBBG(DLM��<DXM��PDTM��\dDPM��lB�I�B �D(�A0�GPz
0D(A BBBBj
0D(A BBBK�D`Q��$�D\Q��uB�D�g
BA8E�Q��{B�B�F �A(�A0�g(A BBBL<E�Q��B�B�J �D(�D0�s
(A BBBA{
(A BBBA4�E�R��aT�D�K e
AAFDCAH��d�ES���B�B�B �E(�D0�H8�G`�hNpExA�L`ihKpUhA`D
8D0A(B BBBHH,F�U��B�J�E �M(�H0�D8�Jp�
8C0A(B BBBDPxF\Y��
B�G�D �L(�P@w
(F ABBEd
(C ABBD(�FZ���A�J��
AAA�F�[��>NOKU`G�[���B�E�E �A(�D0��
(C BBBA~
(F BBBAk
(A DBBF|G�\��$�G�\���N hZ b
FN
J�G�]���G�]���G�]���G�]��H�]��A�W4(H�]��NB�B�A �D(�D0w(D ABB4`H�]��vB�A�D �|
ABJO
CBKH�H<^��3B�B�E �E(�A0�A8�Dp�
8D0A(B BBBCH�H0d���B�H�B �B(�D0�C8�GP�
8D0A(B BBBE 0I�h��YJ�YE�P�`8TI i���B�A�A �O
ABJb
ABK8�I�i���B�A�D �@
ABFZ
ABC0�Ij��NA�D�L f
AAGKAA(J4j��NQ�D�G kA�A�(,JXj��(A�A�G �
DAF(XJ\k���B�D�D ��ABD�J�k���B�F�H �H(�A0�G8�K`l8A0A(B BBB�JHl��1<�Jtl��rB�B�B �A(�A0�W
(D BBBA, K�l���B�F�D ��
ABBtPK�m���B�E�B �E(�D0�D8�GPj
8A0A(B BBBGX
8A0A(B BBBFD8F0A(B BBBH�K�m���R�B�B �E(�A0�D8�LP�
8A0A(B BBBCLpq��(L|q��cDp[<@L�q���B�E�A �D��
 AABBd FAB�Ldr��$�L`r��#A�D�G TAAT�Lhr�� B�E�B �H(�A0�A8�D`P
8D0A(B BBBDYhGpVhA`0M0s���A�G�GPL
CAA\CA@HM�s��-B�J�C �G�n
 CABFR
 CABH4�Mxt���A�K�G�|
CAE\
CAH4�M u���A�E�G�t
CAK\CA�����"��s0�:�:@9 :�99�8@8�7�7p00��P�� ������������@� ��������@��@������`�����@�&(&6&C&Q&_&o&z&�&�&�
���"��"���o�8=�
�&�"u�h0	���o@h���o�o4d���oJ��"6�F�V�f�v���������Ɛ֐�����&�6�F�V�f�v���������Ƒ֑�����&�6�F�V�f�v���������ƒ֒�����&�6�F�V�f�v���������Ɠ֓�����&�6�F�V�f�v���������Ɣ֔�����&�6�F�V�f�v���������ƕ֕�����&�6�F�V�f�v���������Ɩ֖�����&�6�F�V�f�v���������Ɨ֗�����&�6�F�V�f�v���������Ƙ֘�����&�6�F�V�f�v���������ƙ֙�����&�6�F�V�f�v���������ƚ֚�����&�6�F�V�f�v���������ƛ֛�����&�6�F�V�f�v���������Ɯ֜�����&�6�F�V�f�v���������Ɲ֝�����&�6�F�V�f�v���������ƞ֞�����&�6�F�V�f�v���������Ɵ֟�����&�6�F�V�f�v���������Ơ֠�����&�6�F�V�f�v���������ơ֡�����&��GPGG�"GF�4�)Gw.G34G�9Gn=G�AG*FG�KG�SG�[G�dGhG,
lG�qGxG��GA$3a1��libaprutil-1.so.0.6.3-1.6.3-2.el8.cloudlinux.x86_64.debug2%��7zXZ�ִF!t/��;�m]?�E�h=��ڊ�2N���&W�=��C��%��4	-Cz�|�A:*�����d�w��ѱ*��؈g-�q�+��o�%��������
�)�^�O%��[*�I����<��=C*��u�(r2
��p	�u���&�#^fɰ5�ʇ�q~i�O��^���h`#YI(,���G4K�)�-�'��d���gI��Z����ڞyT��P35��gP	�K�f�`��Q� /�yu�޿�h��v;f�8�L��,"$�dk��RM�_������P
)#-�I_�9S^k����ɖ�������]N�<9:���Rc7m@^����_�>KE#_���	�b�'���|
����SD[i�����Px��j\PJ����-�k#�7y��	���2,<�ȅ���hO���Tȟ�7݇�Ű��3�y#<���W�P�^�^\��f�V�������i�,�g���q�G�;SƋE
+��߃uz�؉� ~��N?*����2q.@���#��V���fړ������N�fv<����A��5��4ʭ"�k�E�p�m�[
o�Kp�������r}S�Ux�݈>X�@2����2=���=s��W��E��(�����~���7�F��~�!M~U�
9P�k�e �jP���o���eQ��F�>��/��Y{O~7��:!#;`�‰�C�8b��9'D"�2���mX���{Nl�u�S�Qh�]��X�A������n0���3�?��+G�'`
s	��-�}����>n[�I�&�{�
	+8���'A��)��+�G.u�ug�0��@��RX�¯�+���`�uң9�7Jq#F�@�
��p����>E�I�qZ��Ei�SE���Tz���}ͣ����|��	�C���$2�8����\n�CE5�u���@<�����H4��E{�a����?��O�8�"�r�o��$�*M��/G:��{��Fk�]���`��_��=ބ";�x**�0zAQG���6�z.�1���;}��z���T���@&��5�5�9���-#?���T|�T��CF���Y�:����8p���u1��A����V�?��������8C�׳��&�9��/r+�9k� �ñ�@�5X8�Pl���6B~yM��X�wMvcX��'�m�5.�Zh�<���E�(Sid�ozG���C4٧����tv
��6�;�<F&�Ѹ�X���I⚭�YaU>㶹��瘩7�!~���)c.��3�L6?Ug�D���ΘC�k�=�#	�H��9�Ҥ���N�I�37C�p8C��5���E��0��ʚ<r�N����f�b9��w�'넒�9bIiH�	��^C�C"mA)yv�T�LcRr�[�����E��i�ܺ��93�1�M�/�\��Zݽ�P#ÀX�LYo)���z�E�D9��O;�Կ���� �c�w�(��"6{U 6)�n��&R�t�`�Q�u��	�YW?E��]�I���5zE�o��O-p�z�,&��zv��3C+#U�4��o���ŝ0�S|��o��Ǿx�z���0:�Ӣ�k��'�O~�g���GtNo��}��-�YRO�K�Hq�����R�\�;�j�������Za��}��/����>��4��ΙYͷ�ᧆЉ�r
�>03]�\L�cT�*�N��e#�O6��������_"��P�a��ܭJ.v��4�b�DoUj���M�"vpҨ�����E+�vh�aٕ{�8╱1����	v\��љ�4Ƭ��n�e��ٯ�vJ�6p��]A�D�s�^�ن+(��1�������د���|l	��1z��߭HA�<����?�³����Z}���"�[�J[~�@��*[(뤴��x9�EIUǫ��Y�U��06t���;�����'�D��zZJI�^��S�k���_�ٴI

x�o��qE��i8�"�ڍ��P���-(~$G��n�\T=�P�:��2��T&����ԣ6��A�s2Z�+�
9����@K���y��rv�s��$�5�ev���a���-���a}�A��|.����V��*s��ň���M�B����~�;ņ�-��	��º}����e��O����ƍ�ݞ�*@�&nю䧪�:�B&�79���X����Q�|�r*�,�0�
�k�hy��dZpoN	�!��Bҳ��`�C
>ȍ�v��c��+��f�Ok��O���o|;�
�M<�\[Ī!�z�H��{+r��"����AԢ
���<::�ԄD���A*�d`��G=�-�)��*��Ȳ������]n1�������T�\y��D+����T �*w� ��[>K0���b>��8����핡�Z�� �Y�sQ���_w涉j��Wܰ��R��)�׉���r�
v�9���A�%��Ÿ��X%h���h���)�!� ��a���بi��G��_�Nc������iė��&;�������5�{�f˃>�V��:��{�I�.l���4�F^U��k�������7껖�	�-R�(7R��>UЗ�2ip.�*��WP�[��'h��;詧?��skY��l��Q��e}q�b��{b�of�o֝(�L%c���z����W�d���iW���F bS�tӲ��t���9
�w�8<ѱ0��[�����m7��'�+��}"ܖ��f*	��t���*k25�/���s�u
���J�x��F���<�7qX��~�?N;�ILϹM��e�*��ػ�B�C���S��H�M����ר5�)<e.L�L��:��+��3�C�,�+�u�Wl�4B�b\W�\���K0��<������V+Re�R(�����u�#�
������%URU&��1]L�b���uzzY�!Ԍc-�+|h�8C����\/��K\w��� �P���)�R�q�|+=��@��<)�oŽ�Pv��f�
�r"NC��&��h��]��n�Wq���\ �"���j|���ߑ!RP��;š���WBO�
�|V�^LY�-;���S�(�[BZ�
����@�l+�6�.�b4 A�w���vN~%�I�L�R-��3;��\�	�y�㒯<��L]�����ӡr�Ȏ�s�W-lh1���/N�qEu�T3����,�ˡߛ�9�	Z%{7�l�qu6l�%���|�9�	����VlN���I5�Vފ ���*׼�UN�J n�G�Ÿkg�4/*�Ȯ�6Wa���V@:ͬA��R`$�W_��[6Q+]��H�n��y��‹r��#���L]B
K��M"�b4��H>>�$���x�wsp'�������A�r��j���hy��JT~��N���ia��Q]���"ވj�æ?�'�DQ
���BQ�3�V]jؽs\�G=�F=6�s1ʰ��~�����_\���j�a �8:LL��"l��5K0�[���i��P���H�J���b������
����#�_|G|���P��<Wi�hD���9���J��OTE��i��	��SK���W{��n�mX���D��;z�i8:x���d���E�6y$�W������}�L ���.Ss@�L�V�Z�\^�g�5=9|*�!�PDI�ۗ��`^-���}��?�ܤKn=�l���{IԒ&�	�����i4$�}�tA|5̕{�$=���{�n��%TK���S��XN>Jqˆ��JGj���b��;>���7n=�;o�����m�S錊�I�OD*����ce�?�D��n�g��kЎJ�T�/U)��������<�ۆ�X�����&�.�o|�]�$[�l
��|��b�]������r�	���ws�����g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.got.plt.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata��$���o���
(���008=8=�&8���o4d4dE���o@h@h�T�h�h0^Buuh��c � �n0�0�qyt��
z��`. � J J�
�XX�M���"�����"�����"��X ���"��P�H�"H����"�	� �" �� �к"к����bк$��@4����lib64/libapr-1.so.0.7.6000075500000746320150336140420010122 0ustar00ELF>��@��@8@�� ����#��#�0% P�P�#P�#���$$P�td�����Q�tdR�td����#��#PPGNU���E㤮�z����$�	�@�	�
@�P��`$vT8"�����	P@��2�1	��� ��a�;�B���0���	1��ihX
x6#a�E�1x�#oO� ��6bA��&�� U!@��L��$I�&D �.0H 1�dHMP"Z�
5iB4�����X"@z�	&�Av�'C�LA*�D�PL6�(��V
2���D��@ @2D�`@D�M*� ����P!H���"FD@@ �8@�@�Q  @!H�Q2t�PH\@�e`F>�� H �!�  	 ��ED'0JXa��	��"
����!�
�0�l�
FJ����0�@�P�B�B$��@�H�N��b�@�҈0
�P�Ȑ2�C���������������������������������
 #$%&'(*,-.014579:<>@ABCDEFGHIJMNQRTVXY[]_`adfhijmnpqsuvxy|������������������������������������������������������������������������������

"$%')*-/0578;>@ACDEGIKMPQRSUVWY[^_afghjlmoqrstvwy{}~�����������������������������������������������������������������������������	 U�5pn��Xwy#|$l���iR9K� ���	��;�f@�̙�L�m�̓�7NJ����ص�Xbǧ��(�*��yͦ1p��a�]�u�o!8�㲙<	9v�d(R�'�DR����*���
�+džJ�ܖ
C��Y2A�yYV�X��M��b��Y�t�@!�C̈́��a��{d_W�ԋ�[-��g���u���J�s�U���[��@A�"���w���
�n>���)�L�n��Ҍl�݉�১ɉ��zv����}�fgѓ�եs$N5�Wb�4O)g�UD٭5|L%zYbj���������pѓ�I��ܘ4d�%x�'sSЩH+䴹
;g�tv�/�Q�Y�(l�'�l���J�q�B�Z�K�����[�PD��UX=˙X7V�Bhsb�ě���Qa�Eϖ��\�(����):���(��j+*G�x��d����r)�s��]��ip]X���S�$:���}m�d��3A�U�X-��9]9oD�^h�%�U^䴅�fV�+�Lh"ugbt���=Lk�UٷN����|i�TX2x��~D������ij1�"�~��IQM��%^�c?�&&q�o�^ļ^�\
��٭�!X%�}�65��!��1�R�����BE��BfSm�k���tV?9�;��a�ƫ}��\�J�cCy�d�%���+�8-Ӷ�A�1��j��X�����z|���E	�}�@VK�
I-�ͻS��u45�&�^�KOT�/l�k�J_���b�7$\�����Ъ�an�k�oy���b8�)J��K֜GG&�5���
5�H��󪳉|�]�eeisC��i�(9��v^�Պ���Y��j�^��'ܚʨ^�3p�ZX3?��� � �mP��1?��H��V">��b��1;'&��V�6b���)V;/]R��-Zt���K�,�.���IўQ2	 �_�c�f���\��6��0�@�)"��,���b�!����z�0���r_���M�y�Uu�� �3�G�牣#0�EK#ahwzWo���(7�{�.��3�5\�X�{[~���师���Q����VXc����V?�\��1;۟���k��U��L��bׯ��s�\�]�m�m�Ve�e%߰""=H�%�bo�
20��;�D�SX��n�_�yD���r-k�d�XiyI�(�i��3���Z��/���C3_��@цPM�h��[��}.p�+�N8�(���s�Yu�����O��q%U&�h\��C�p��PUא��g�E��P��&H�m��Z��Ay��Xg/,ؖ�=c�J�� '�
���~����_��TB��\Ʌ��_,��������kA_[d|x�]���Xk�lV;����1�9q1�#�C�V
�12�xk�����j3�Ӎ["�O w��7;��*�$f�ȽƉ��s��dRo�jg>�Z�jG�J{hA!3���:Y�7&v��K"�70p���R���	�P�M��ܕy���1V�Y��5�d:�
IL,&8���h�u�w)���9�2p9T�����1-Z�
��s_L�L�#C;a�Ty_�k������􆾞�Փ�>��W������n��ڢ����1�fN*�5�0�S!�)��Ϛt���d���٧����O�*�嶵���D�`�r_ŵ�p���o���޷^L!�w�ۏ�R�1\ϩ�G�6p1m�AJC����)�2���j���
�"ɕ5m�j�.�T&kR��������b�]–*W
F�m��Yr]jL%��kY}pto�X���g$��%^V^�]���Vߏµ�א��e}�93�C6Q��=y����ωV�b,�� c�����1���dLg���|d_op�#
_�e��.p��oǗ�D�(�\�o�`�d\���RC��������҄W�6�щ�!3��_O_o�9�\��MJ�ؖ��=�NMN��+��W��_DwC��Ȩ6c�%j�h��щ�@�U��A3]�vF
��滊�W*�����y�r��;ZF8�e�7�ZVF��{����G3�~[���zQ5G��ʚv�=F
�Z�/�|+䶀ނ��|�7�G;��ْ���E�2���Df0p}Ⱥ��?�c����W��)C���L�c���+�qu��z��;�V[
�+r��/�mP�=ehԉ!u��G�9@%�m���(H�9x��\"ȿ��$�vy��v��Gf��(�ۙ/�Lf]�`�m�������?�*�c���b�*�j��Py�鱊�4��|�v��^a)5|`I[���X��6��*I�
{��d@��m�x�qX��+�G��R-�~��t�_��!u�5%3�C?����d)"�&�1n0jg2
��*� ��4%20
��x0�w$�M"�%0,&~.�wC�%�3a9'��gU�5�a��5�1?�'��&�3�D�_"��X4�k;4u+��]:/�/�(I%:��) &�/X)���0��'�L/���|"�/ \$2C0���5�*^i1�T"q3�+2�"Q$7n'%lQ&��r1N#B/k%O%.�q5�58k$D3�(*O^'W5z%��1S/o#�I��g,-��/�/H2KK"1�%�0a/4N0|5�(�3_&2�'�/[, Z/�%�2QG91�)F"�0h/y.
��(��%�''���2`�
# @(n/����!P2�5��s���d�.t�)�k���.�������&0j<"3:�	E��@fP��)]��e��L	Њq��,� �B,!�1-D%�W�)p����|!,��[�+��&���'�r,�) ��
�����I �,��# E!+��W3`�W�0h! 2��c�&@p��P�
X.@��#E4��'�-�t&�ix�0��9��M��r��
��	gP�B��V0�@�
�(n�0���&�;���
е6-�.(�|��,P�%-жu��uF,��U���7
��85
��0//0�X�' {~0p�62`�R���3�����<`5�s>#@C (
����4, ���0�'$��
- ����&�'`zG�+0�:��95I�'Px���a���B0��1� ��<�Cc�.нM��P��p���`Z����^�^	0�	"�}�0}:J �@@�?c�H��y
5@.' t!�	@�+p85�!p2� `0T*@����o��h��W�&�o��	p� �0�,R*��n���%$PG\@���'�zd$�E�P�p	U2 ������
p�Cv#0De��=�P���?2��	�1��	�,`�
r]n,`����a4�� ��p���( �\`���(�B��R
@�
+��^?.0�xP��q�U��!6X�#�@�iP��@�������	�0�d ��0��`���&�n� 4��
����. ��%Pa/���u ��� @-� ���!@2� �/kg��V)�#�P�	�@���7�N��;���J�$�Q�$�S�����X
 �O)Ȭ#�0�
�0��4)P�#L0��������~*���a
P�!V!2�	��)���� �-
Ь�$�Fb�)0���$�Qo�5S�(ЄE�#�D*.���%
`���
��.��S	%pUB�r4���4��*y�
	n3����u(��
���?&�g��
p�
�@ p%�U1��	�
��
`��@pF��-��`"�0��`�g�`2N ,f�� "D�.p�WV0@�-��1�"B[#C2��	�4`��P!��)���*ج#@�
�#�D��}��K�	��#2���0>�"�@xI ~�O�.2V,�B�Й:/��O| 0-f���I
��b�,��d:*��	UP�1�p��^(P~�"�24H��jy`���+�$��3%�V8@�f^+��.��
��B'Pt�	0��`��b����2RE��`��.�����`������ 3p�%P`82��.��j*�+I5���&0fr�#�D�
����*@��	o
`�	�WP5i�@�
��� �-��5@�$�����?w@/���I�%�p	A
0�z
@��+�3@�	�
`��@�:`�\#`C�	��Qp.C����)p��(��x�y'�-m� 	"�%�\1P��-�c'�t!� ��V�um-�GN	.Г��u{h)Ь#�P	���
�4��B�q3#*p�	k���!�1����p$a,��0l"�9��q6*P��`@�+Ш&�@	\�� )m&t?��6�/@���.������P|~m ��4��L�*0�% ]�
��y� 7�, �+�
`�/��������a�(��R�Pt*i  -4~����-@�GoP����|��s	�#��
!�P�"X%�~�-p�^��)~/���P��V��.�p3��&�r� v20��2���$�T��3R�$ R��`	�2	���.����I� P-&�}�-���@�	�	�Hp�MD%D�����io��%yp&����&@n�z	ps�Y��J50�~�����wP-:a�/0�M�
��"`B��'PzS'ptnV -�
��`	��ж
)5
��cPo\Pq>`^(p��C$�K��Ђ
; P("*`��^��S5��e�p705@���4����P� 8.dP��z0�)�S�	'��+K�10��u�'0{��$R&4��f���s��	�4�C��pV�86�* �E(@}�9�t�p��u'u=5$@Hr]��%���%dp����Xq��H+`�Y� �Mus&0e���|L� &���
�`���
P��2p�f0�1�2'�-����7�,P�a&ph3y0������E!2�1����pps�3�����T-��N����1��&0+��Z�P�C�����p�n	��`�n
0���5��g�+P�9�P7�
��	D�tc�$�Q�+k�)0��2@�P1146�#��.���y@2^	������Z(�|��.d�%�c��*0���%�p�h
0��(��K�"�:@��	�#���1��0"�2@�H4p��}!02��p.P�N�0�a~@�	�2���8�
�"�<EE-��!`2�,��0�+� �	-`���y��3���# �� 6\�`�
�/��G��a�#�D�0���,�=��4��
(|d���C.�
�*@��"�������$&�3���@�
�ЦH'3 �8�PW(6X�#�p	�2P�����$�R�},@��"@A��`�p}1Q�4�P8__gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizeapr_encode_base64strlenapr_encode_base64_binaryapr_pencode_base64apr_pallocapr_pencode_base64_binaryapr_decode_base64apr_decode_base64_binaryapr_pdecode_base64apr_pdecode_base64_binaryapr_encode_base32apr_encode_base32_binaryapr_pencode_base32apr_pencode_base32_binaryapr_decode_base32apr_decode_base32_binaryapr_pdecode_base32apr_pdecode_base32_binaryapr_encode_base16apr_encode_base16_binaryapr_pencode_base16apr_pencode_base16_binaryapr_decode_base16apr_decode_base16_binaryapr_pdecode_base16apr_pdecode_base16_binaryapr_escape_shellapr_pescape_shellapr_unescape_url__ctype_b_locstrchrapr_punescape_urlapr_escape_path_segmentapr_pescape_path_segmentapr_escape_pathapr_pescape_pathapr_escape_urlencodedapr_pescape_urlencodedapr_escape_entityapr_snprintfapr_pescape_entityapr_unescape_entitystrncmpapr_punescape_entityapr_escape_echoapr_pescape_echoapr_escape_hexapr_pescape_hexapr_unescape_hexapr_punescape_hexapr_escape_ldapapr_pescape_ldapapr_password_getgetpassapr_cpystrnmemsetapr_tokenize_to_argvapr_filepath_name_getstrrchrapr_collapse_spacesapr_cstr_match_glob_listapr_fnmatchapr_cstr_match_liststrcmpapr_cstr_tokenizeapr_strtokapr_cstr_split_appendapr_pstrdupapr_array_pushapr_cstr_splitapr_array_makeapr_cstr_count_newlinesapr_cstr_casecmpapr_cstr_casecmpnapr_cstr_strtoui64__errno_locationapr_strtoi64apr_cstr_atoui64apr_cstr_atouiapr_cstr_strtoi64apr_cstr_atoi64apr_cstr_atoiapr_cstr_skip_prefix__ctype_tolower_locapr_fnmatch_testapr_match_globapr_pstrmemdupapr_dir_openapr_dir_readapr_dir_closemodfapr_vformatterapr_strfsizememcpyapr_strerrorapr_sockaddr_ip_getbufapr_vsnprintfapr_pstrndupmemchrapr_pmemdupapr_pstrcatapr_pstrcatvapr_strtoffstrtolapr_atoi64apr_itoaapr_ltoaapr_off_t_toa__ctype_toupper_locapr_strnatcmpapr_strnatcasecmpmemcmpapr_hash_makeapr_time_nowapr_hash_make_customapr_hash_nextapr_hash_firstapr_hash_thisapr_hash_this_keyapr_hash_this_key_lenapr_hash_this_valapr_hashfunc_defaultapr_hash_copyapr_hash_getapr_hash_setapr_hash_countapr_hash_clearapr_hash_mergeapr_hash_overlayapr_hash_doapr_hash_pool_getrandreallocmallocapr_skiplist_allocapr_skiplist_freeapr_skiplist_findapr_skiplist_find_compareapr_skiplist_last_compareapr_skiplist_lastapr_skiplist_getlistapr_skiplist_nextapr_skiplist_previousapr_skiplist_elementapr_skiplist_insert_compareapr_skiplist_insertapr_skiplist_add_indexapr_skiplist_set_compareabortapr_skiplist_initapr_skiplist_add_compareapr_skiplist_addapr_skiplist_replace_compareapr_skiplist_replaceapr_skiplist_remove_nodeapr_skiplist_remove_compareapr_skiplist_removeapr_skiplist_remove_allapr_skiplist_popapr_skiplist_peekapr_skiplist_sizeapr_skiplist_heightapr_skiplist_preheightapr_skiplist_set_preheightapr_skiplist_destroyapr_skiplist_mergeapr_is_empty_arrayapr_array_clearapr_array_popapr_array_catapr_array_copyapr_array_copy_hdrapr_array_appendapr_array_pstrcatapr_table_eltsapr_is_empty_tableapr_table_makeapr_table_copyapr_table_clearapr_table_getstrcasecmpapr_table_setapr_table_setnapr_table_unsetapr_table_mergeapr_table_mergenapr_table_addapr_table_cloneapr_table_addnapr_table_overlayapr_table_vdoapr_table_doapr_table_compressstrcpyapr_table_overlapapr_table_getmapr_atomic_initapr_atomic_read32apr_atomic_set32apr_atomic_add32apr_atomic_sub32apr_atomic_inc32apr_atomic_dec32apr_atomic_cas32apr_atomic_xchg32apr_atomic_casptrapr_atomic_xchgptrapr_atomic_read64apr_atomic_set64apr_atomic_add64apr_atomic_sub64apr_atomic_inc64apr_atomic_dec64apr_atomic_cas64apr_atomic_xchg64dlcloseapr_os_dso_handle_putapr_os_dso_handle_getapr_dso_loaddlopenapr_pool_cleanup_nullapr_pool_cleanup_registerdlerrorapr_dso_unloadapr_pool_cleanup_runapr_dso_symdlsymapr_dso_errorapr_file_buffer_setapr_thread_mutex_lockapr_thread_mutex_unlockapr_file_flush_lockedapr_file_buffer_size_getapr_file_openapr_file_write_fullapr_file_readapr_file_closeapr_file_info_getapr_file_perms_setapr_file_copyapr_file_appendclosediropendirreaddirapr_statapr_dir_rewindrewinddirapr_dir_makeapr_unix_perms2modemkdirapr_dir_make_recursiveapr_dir_removermdirapr_os_dir_getapr_os_dir_putapr_file_name_getapr_file_flags_getapr_unix_mode2permsapr_file_data_getapr_pool_userdata_getapr_file_data_setapr_pool_userdata_setdup3apr_unix_child_file_cleanupapr_unix_file_cleanupapr_thread_mutex_createapr_file_dupapr_file_dup2apr_file_setasideapr_thread_mutex_destroyapr_pool_cleanup_killapr_filepath_getgetcwdapr_filepath_setchdirapr_filepath_rootapr_filepath_mergeapr_filepath_list_splitapr_filepath_list_split_implapr_filepath_list_mergeapr_filepath_list_merge_implapr_filepath_encodingapr_time_ansi_putapr_file_info_get_locked__fxstatapr_file_flushchmod__lxstat__xstatapr_file_attrs_setapr_file_mtime_setutimesapr_stat_fdapr_file_lockfcntlapr_file_unlockapr_file_read_fullapr_file_writeapr_file_writev_fullapr_file_writevapr_file_mktempmkstempapr_os_file_putapr_file_removeapr_file_renameapr_os_file_getapr_file_eofapr_file_open_flags_stderrapr_file_open_flags_stdoutapr_file_open_flags_stdinapr_file_open_stderrapr_file_open_stdoutapr_file_open_stdinapr_file_inherit_setapr_pool_child_cleanup_setapr_file_inherit_unsetapr_file_pool_getapr_file_linkapr_file_pipe_timeout_setapr_file_pipe_timeout_getapr_os_pipe_put_exapr_os_pipe_putapr_file_pipe_createapr_file_pipe_create_exapr_file_pipe_create_poolsapr_file_namedpipe_createmkfifoapr_file_ungetcapr_file_putsapr_wait_for_io_or_timeoutapr_file_getclseekapr_file_putcapr_file_syncfsyncapr_file_datasyncfdatasyncapr_file_getsapr_file_printfapr_file_seekapr_file_truncftruncateapr_temp_dir_getapr_env_getapr_proc_mutex_destroyapr_global_mutex_createapr_proc_mutex_createapr_global_mutex_child_initapr_proc_mutex_child_initapr_global_mutex_lockapr_proc_mutex_lockapr_global_mutex_trylockapr_thread_mutex_trylockapr_proc_mutex_trylockapr_global_mutex_timedlockapr_thread_mutex_timedlockapr_proc_mutex_timedlockapr_global_mutex_unlockapr_proc_mutex_unlockapr_os_global_mutex_getapr_global_mutex_destroyapr_global_mutex_lockfileapr_proc_mutex_lockfileapr_global_mutex_mechapr_proc_mutex_mechapr_global_mutex_nameapr_proc_mutex_nameapr_global_mutex_perms_setapr_proc_mutex_perms_setapr_global_mutex_pool_getapr_proc_mutex_cleanuppthread_mutex_unlockpthread_mutex_destroypthread_mutex_timedlockpthread_mutex_consistentpthread_mutex_trylockpthread_mutex_locksem_opensem_unlinksemctlmunmapmmappthread_mutexattr_initpthread_mutexattr_setpsharedpthread_mutexattr_setrobustpthread_mutexattr_setprotocolpthread_mutex_initpthread_mutexattr_destroysem_closesem_postsem_trywaitsem_timedwaitsem_waitsemopsemtimedopsemgetfchownflockapr_proc_mutex_unix_setup_lockapr_sleepapr_proc_mutex_defnameapr_proc_mutex_pool_getapr_os_proc_mutex_get_exapr_os_proc_mutex_getapr_os_proc_mutex_put_exapr_os_proc_mutex_putpthread_cond_destroyapr_thread_cond_createpthread_cond_initapr_thread_cond_waitpthread_cond_waitapr_thread_cond_timedwaitpthread_cond_timedwaitapr_thread_cond_signalpthread_cond_signalapr_thread_cond_broadcastpthread_cond_broadcastapr_thread_cond_destroyapr_thread_cond_pool_getpthread_mutexattr_settypeapr_thread_mutex_pool_getpthread_rwlock_destroyapr_thread_rwlock_createpthread_rwlock_initapr_thread_rwlock_rdlockpthread_rwlock_rdlockapr_thread_rwlock_tryrdlockpthread_rwlock_tryrdlockapr_thread_rwlock_wrlockpthread_rwlock_wrlockapr_thread_rwlock_trywrlockpthread_rwlock_trywrlockapr_thread_rwlock_unlockpthread_rwlock_unlockapr_thread_rwlock_destroyapr_thread_rwlock_pool_getapr_proc_waitapr_proc_killapr_allocator_createapr_allocator_destroyapr_allocator_mutex_setapr_allocator_mutex_getapr_allocator_owner_setapr_allocator_owner_getapr_allocator_max_free_setapr_allocator_alignapr_allocator_allocapr_allocator_freeapr_pcallocapr_pool_destroyapr_pool_terminateapr_pool_clearapr_pool_create_exapr_pool_create_unmanaged_exapr_pool_create_core_exapr_pvsprintfapr_psprintfapr_pool_abort_setapr_pool_abort_getapr_pool_parent_getapr_pool_allocator_getapr_pool_is_ancestorapr_pool_tagapr_pool_initializeapr_pool_userdata_setnapr_pool_pre_cleanup_registerapr_pool_cleanup_for_execapr_pool_note_subprocessapr_palloc_debugapr_pcalloc_debugapr_pool_clear_debugapr_pool_destroy_debugapr_pool_create_ex_debugapr_pool_create_core_ex_debugapr_pool_create_unmanaged_ex_debugapr_os_default_encodingapr_os_locale_encodingnl_langinfogetenvapr_env_setapr_env_deleteunsetenvstrerror_rgai_strerrorapr_getopt_initfprintfapr_getoptapr_getopt_longapr_proc_other_child_registerapr_proc_other_child_unregisterapr_proc_other_child_alertapr_proc_other_child_refreshwaitpidapr_proc_other_child_refresh_allapr_os_uuid_getuuid_generateapr_generate_random_bytesapr_initializeapr_unix_setup_timeapr_signal_initapr_app_initializeapr_terminateapr_terminate2apr_versionapr_version_stringapr_mmap_offsetapr_mmap_createapr_mmap_dupapr_mmap_deleteapr_inet_ntopapr_inet_ptongetifaddrsif_nametoindexfreeifaddrssetsockoptapr_mcast_joinapr_mcast_leaveapr_mcast_hopsapr_mcast_loopbackapr_mcast_interfaceapr_socket_sendapr_socket_recvapr_socket_sendtoapr_socket_recvfromapr_sockaddr_vars_setapr_socket_sendvapr_socket_sendfileapr_socket_opt_setif_indextonamememmoveapr_sockaddr_ip_getgetaddrinfofreeaddrinfoapr_socket_addr_getgetsocknamegetpeernameapr_parse_addr_portapr_sockaddr_info_getapr_sockaddr_info_copyapr_getnameinfo__h_errno_locationapr_getservbynamegetservbyname_rapr_sockaddr_equalapr_sockaddr_is_wildcardapr_ipsubnet_createapr_ipsubnet_testapr_sockaddr_zone_setapr_sockaddr_zone_getapr_socket_atreadeofapr_pollapr_socket_protocol_getapr_socket_createsocketapr_socket_shutdownapr_socket_closeapr_socket_bindapr_socket_listenapr_socket_acceptaccept4apr_socket_connectgetsockoptapr_socket_type_getapr_socket_data_getapr_socket_data_setapr_os_sock_getapr_os_sock_makeapr_os_sock_putapr_socket_pool_getapr_socket_inherit_setapr_socket_inherit_unsetapr_socket_timeout_setapr_socket_timeout_getapr_socket_opt_getapr_socket_atmarkioctlapr_gethostnameapr_socket_perms_setepoll_waitapr_poll_drain_wakeup_pipeepoll_ctlepoll_create1apr_pollcb_provider_epollapr_pollset_provider_epollapr_pollcb_provider_pollapr_pollset_provider_pollapr_poll_close_wakeup_pipeapr_pollcb_addapr_pollcb_create_exapr_poll_create_wakeup_pipeapr_pollcb_createapr_pollcb_removeapr_pollcb_pollapr_pollcb_wakeupapr_pollcb_method_nameapr_pollset_method_nameapr_poll_method_defnameapr_pollset_destroyapr_pollset_wakeupapr_pollset_addapr_pollset_create_exapr_pollset_provider_selectapr_pollset_createapr_pollset_removeapr_pollset_pollapr_random_initapr_random_after_forkapr_random_standard_newapr_crypto_sha256_newapr_random_add_entropy__assert_failapr_random_secure_bytesapr_random_insecure_bytesapr_random_barrierapr_random_secure_readyapr_random_insecure_readyapr__SHA256_Initapr__SHA256_Transformapr__SHA256_Updateapr__SHA256_Finalapr__SHA256_Endapr__SHA256_Dataaccessapr_shm_createapr_shm_create_exapr_shm_removeapr_shm_deleteapr_shm_destroyapr_shm_attachapr_shm_attach_exapr_shm_detachapr_shm_baseaddr_getapr_shm_size_getapr_shm_perms_setapr_shm_pool_getapr_os_shm_getapr_os_shm_putapr_lve_environment_initapr_lve_environment_init_groupapr_lve_environment_init_group_minuidapr_procattr_createapr_procattr_io_setapr_procattr_child_in_setapr_procattr_child_out_setapr_procattr_child_err_setapr_procattr_dir_setapr_procattr_cmdtype_setapr_procattr_detach_setapr_proc_forkgetpidapr_procattr_child_errfn_setapr_procattr_error_check_setapr_procattr_addrspace_setapr_procattr_user_setapr_uid_getapr_procattr_group_setapr_gid_getapr_proc_createapr_signalgeteuidsetrlimitexecvesetgidsetuidexecvpexecvapr_proc_detachapr_proc_wait_all_procsapr_procattr_limit_setapr_procattr_perms_set_registersetsidfreopenperrorfwritesigdelsetsigemptysetsigactionapr_signal_description_getsys_siglistapr_signal_threadsigfillsetsigwaitapr_setup_signal_threadpthread_sigmaskapr_signal_blocksigaddsetapr_signal_unblockpthread_attr_destroyapr_threadattr_createpthread_attr_initapr_threadattr_detach_setpthread_attr_setdetachstateapr_threadattr_detach_getpthread_attr_getdetachstateapr_threadattr_stacksize_setpthread_attr_setstacksizeapr_threadattr_guardsize_setpthread_attr_setguardsizeapr_thread_createpthread_createapr_os_thread_currentpthread_selfapr_os_thread_equalapr_thread_exitpthread_exitapr_thread_joinpthread_joinapr_thread_detachpthread_detachapr_thread_yieldpthread_yieldapr_thread_data_getapr_thread_data_setapr_os_thread_getapr_os_thread_putapr_thread_once_initapr_thread_oncepthread_onceapr_thread_pool_getapr_threadkey_private_createpthread_key_createapr_threadkey_private_getpthread_getspecificapr_threadkey_private_setpthread_setspecificapr_threadkey_private_deletepthread_key_deleteapr_threadkey_data_getapr_threadkey_data_setapr_os_threadkey_getapr_os_threadkey_putgettimeofdayapr_time_exp_tzgmtime_rapr_time_exp_gmtapr_time_exp_ltlocaltime_rapr_time_exp_getapr_time_exp_gmt_getapr_os_imp_time_getapr_os_exp_time_getapr_os_imp_time_putapr_os_exp_time_putapr_time_clock_hiresapr_rfc822_dateapr_day_snamesapr_month_snamesapr_ctimeapr_strftimeapr_gid_name_getgetgrgid_rgetgrnam_rapr_uid_homepath_getgetpwnam_rapr_uid_currentgetuidgetgidapr_uid_name_getgetpwuid_rlibuuid.so.1libcrypt.so.1libpthread.so.0libdl.so.2libc.so.6_edata__bss_start_endlibapr-1.so.0UUID_1.0GLIBC_2.2.5GLIBC_2.4GLIBC_2.12GLIBC_2.3.2GLIBC_2.14GLIBC_2.10GLIBC_2.9GLIBC_2.3.3GLIBC_2.3	




�5 �'�	G66 ui	
P6�5Pii

\6���f6ri	q6ui	P66���}6ri	q6���	�6ii
�6si	�6ui	P6ii
�6��#@���#���#��#�#)���#0��#���#���#H�(�#�0�#P8�#@�#�H�#@P�#�X�#`�`�#�p�#����#p��#P��#���#���# ��#���#`���#�К#���#@��#����#`��#@��#���#��#� �#p�0�#��H�#�P�#��X�#P�`�#�h�#�p�#0�x�#`���#����#����#����#`���#P���#��ț#�Л#�؛#`��#p��#���# �# �#0�(�#P�0�#�8�#0�@�#�H�#��P�#`�#`�#�h�#��p�#�x�#���#���#����#���#���#P���#p�Ȝ#���#p��#���#���# ��#�� �#0�(�#P�0�#p�8�#��H�#��Ȭ#��#Ь#�#ج# �#`�#yh�#�p�#x�#��#��#��#���#$��#a��#d��#��#���#eȟ#�П#�؟#��#��#��#���#��#� �#(�#�0�#8�#@�#dH�#5P�#bX�#�`�#h�#�p�#�x�#]��#��#��#���#��#��#m��#��#��#EȠ#0Р#�ؠ#	�#�#��#
��#�#�#B�#
�#I �#F(�#u0�#�8�#>@�#�H�#P�#�X�#`�#<h�#p�#�x�#���#���#q��#��#��#���#���#��#���#*ȡ#@С#ء#�#��#�#���#a�#�#��#�#� �#�(�#80�#�8�#�@�#�H�#P�#X�#`�#�h�#p�#�x�#��#��#\��# ��#s��#!��#"��#���##��#vȢ#$Т#%آ#&�#��#'�#���#B�#��#�#(�#� �#)(�#�0�#�8�#.@�#*H�#
P�#�X�#�`�#+h�#,p�#-x�#.��#���#/��#:��#���#0��#1��#2��#S��#3ȣ#У#4أ#5�#k�#6�#7��#8�#��#9�#:�# �#;(�#<0�#=8�#>@�#?H�#@P�#AX�#B`�#�h�#�p�#x�#I��#���#C��#n��#��#���#D��#E��#���#FȤ#GФ#Hؤ#I�#��##�#J��#K�#��#L�#M�#� �#N(�#0�#�8�#O@�#PH�#QP�#RX�#`�#�h�#[p�#Sx�#��#���#��#���#T��#���#U��#V��#W��#�ȥ#�Х#Xإ#Y�#Z�#O�#[��#�#|�#\�#]�#^ �#�(�#�0�#_8�#�@�#�H�#`P�#�X�#b`�#}h�#�p�#cx�#e��#���#f��#g��#g��#h��#���#i��#(��#�Ȧ#Ц#jئ#��#k�#7�#��#l�#m�#n�#o�#< �#�(�#p0�#8�#�@�#qH�#�P�#rX�#s`�#�h�#�p�#0x�#���#t��#u��#v��#w��#Q��#x��#y��#z��#{ȧ#FЧ#Rا#�#|�#}�#~��#�#��#u�#
�#� �#�(�#T0�#�8�#�@�#�H�#KP�#�X�#�`�#�h�#�p�#Dx�#2��#���#���#���#���#���#��#��#���#�Ȩ#
Ш#�ب#��#��#��#y��#��#��#��#��#� �#X(�#p0�#�8�#�@�#�H�#�P�#�X�#�`�#�h�#�p�#�x�#e��#���#���#o��#���#��#���#���#���#�ȩ#�Щ#�ة#��#��#��#��#��#��#�#��#Z �#�(�#.0�#*8�#�@�#�H�#�P�#�X�#�`�#�h�#�p�#Nx�#/��#��#V��#���#���#���#+��#���#���#�Ȫ#)Ъ#�ت#��##�#��#b��#��#�#��#��#� �#�(�#�0�#�8�#�@�#�H�#�P�#�X�#�`�#�h�#ip�#�x�#O��#Q��#S��#���#���#��#q��#���#���#�ȫ#_Ы#�ث#��#!�#H�#���#��#��#��#��#Z �#�(�#0�#�8�#�@�#�H�#�P�#�X�#�`�#�h�#�p�#Dx�#���#���#o��#���#���#x��H��H�q�"H��t��H����5��"�%��"@�%��"h����%��"h�����%��"h����%��"h����%��"h����%��"h����%��"h����%z�"h�p����%r�"h�`����%j�"h	�P����%b�"h
�@����%Z�"h�0����%R�"h� ����%J�"h
�����%B�"h�����%:�"h���%2�"h����%*�"h�����%"�"h����%�"h����%�"h����%
�"h����%�"h����%��"h�p����%��"h�`����%��"h�P����%��"h�@����%��"h�0����%��"h� ����%��"h�����%��"h�����%��"h���%��"h ����%��"h!�����%��"h"����%��"h#����%��"h$����%��"h%����%��"h&����%z�"h'�p����%r�"h(�`����%j�"h)�P����%b�"h*�@����%Z�"h+�0����%R�"h,� ����%J�"h-�����%B�"h.�����%:�"h/���%2�"h0����%*�"h1�����%"�"h2����%�"h3����%�"h4����%
�"h5����%�"h6����%��"h7�p����%��"h8�`����%��"h9�P����%��"h:�@����%��"h;�0����%��"h<� ����%��"h=�����%��"h>�����%��"h?���%��"h@����%��"hA�����%��"hB����%��"hC����%��"hD����%��"hE����%��"hF����%z�"hG�p����%r�"hH�`����%j�"hI�P����%b�"hJ�@����%Z�"hK�0����%R�"hL� ����%J�"hM�����%B�"hN�����%:�"hO���%2�"hP����%*�"hQ�����%"�"hR����%�"hS����%�"hT����%
�"hU����%�"hV����%��"hW�p����%��"hX�`����%��"hY�P����%��"hZ�@����%��"h[�0����%��"h\� ����%��"h]�����%��"h^�����%��"h_���%��"h`����%��"ha�����%��"hb����%��"hc����%��"hd����%��"he����%��"hf����%z�"hg�p����%r�"hh�`����%j�"hi�P����%b�"hj�@����%Z�"hk�0����%R�"hl� ����%J�"hm�����%B�"hn�����%:�"ho���%2�"hp����%*�"hq�����%"�"hr����%�"hs����%�"ht����%
�"hu����%�"hv����%��"hw�p����%��"hx�`����%��"hy�P����%��"hz�@����%��"h{�0����%��"h|� ����%��"h}�����%��"h~�����%��"h���%��"h�����%��"h������%��"h�����%��"h�����%��"h�����%��"h�����%��"h�����%z�"h��p����%r�"h��`����%j�"h��P����%b�"h��@����%Z�"h��0����%R�"h�� ����%J�"h������%B�"h������%:�"h����%2�"h�����%*�"h������%"�"h�����%�"h�����%�"h�����%
�"h�����%�"h�����%��"h��p����%��"h��`����%��"h��P����%��"h��@����%��"h��0����%��"h�� ����%��"h������%��"h������%��"h����%��"h�����%��"h������%��"h�����%��"h�����%��"h�����%��"h�����%��"h�����%z�"h��p����%r�"h��`����%j�"h��P����%b�"h��@����%Z�"h��0����%R�"h�� ����%J�"h������%B�"h������%:�"h����%2�"h����%*�"h����%"�"h���%�"h���%�"h���%
�"h���%�"h���%��"h��p�%��"h��`�%��"h��P�%��"h��@�%��"h��0�%��"h�� �%��"h���%��"h���%��"h����%��"h����%��"h����%��"h���%��"h���%��"h���%��"h���%��"h���%z�"h��p�%r�"h��`�%j�"h��P�%b�"h��@�%Z�"h��0�%R�"h�� �%J�"h���%B�"h���%:�"h����%2�"h����%*�"h����%"�"h���%�"h���%�"h���%
�"h���%�"h���%��"h��p�%��"h��`�%��"h��P�%��"h��@�%��"h��0�%��"h�� �%��"h���%��"h���%��"h����%��"h����%��"h����%��"h���%��"h���%��"h���%��"h���%��"h���%z�"h��p�%r�"h��`�%j�"h��P�%b�"h��@�%Z�"h��0�%R�"h�� �%J�"h���%B�"h���%:�"h����%2�"h����%*�"h����%"�"h���%�"h���%�"h���%
�"h���%�"h���%��"h��p�%��"h��`�%��"h��P�%��"h��@�%��"h��0�%��"h�� �%��"h���%��"h���%��"h�����%��"h����%��"h����%��"h���%��"h���%��"h���%��"h���%��"h���%z�"h�p��%r�"h�`��%j�"h	�P��%b�"h
�@��%Z�"h�0��%R�"h� ��%J�"h
���%B�"h���%:�"h����%2�"h����%*�"h����%"�"h���%�"h���%�"h���%
�"h���%�"h���%��"h�p��%��"h�`��%��"h�P��%��"h�@��%��"h�0��%��"h� ��%��"h���%��"h���%��"h����%��"h ����%��"h!����%��"h"���%��"h#���%��"h$���%��"h%���%��"h&���%z�"h'�p��%r�"h(�`��%j�"h)�P��%b�"h*�@��%Z�"h+�0��%R�"h,� ��%J�"h-���%B�"h.���%:�"h/����%2�"h0����%*�"h1����%"�"h2���%�"h3���%�"h4���%
�"h5���%�"h6���%��"h7�p��%��"h8�`��%��"h9�P��%��"h:�@��%��"h;�0��%��"h<� ��%��"h=���%��"h>���%��"h?����%��"h@����%��"hA����%��"hB���%��"hC���%��"hD���%��"hE���%��"hF���%z�"hG�p��%r�"hH�`��%j�"hI�P��%b�"hJ�@��%Z�"hK�0��%R�"hL� ��%J�"hM���%B�"hN���%:�"hO����%2�"hP����%*�"hQ����%"�"hR���%�"hS���%�"hT���%
�"hU���%�"hV���%��"hW�p��%��"hX�`��%��"hY�P��%��"hZ�@��%��"h[�0��%��"h\� ��%��"h]���%��"h^���%��"h_����%��"h`����%��"ha����%��"hb���%��"hc���%��"hd���%��"he���%��"hf���%z�"hg�p��%r�"hh�`��%j�"hi�P��%b�"hj�@��%Z�"hk�0��%R�"hl� ��%J�"hm���%B�"hn���%:�"ho����%2�"hp����%*�"hq����%"�"hr���%�"hs���%�"ht���%
�"hu���%�"hv���%��"hw�p��%��"hx�`��%��"hy�P��%��"hz�@��%��"h{�0��%��"h|� ��%��"h}���%��"h~���%��"h����%��"h�����%��"h�����%��"h����%��"h����%��"h����%��"h����%��"h����%z�"h��p��%r�"h��`��%j�"h��P��%b�"h��@��%Z�"h��0��%R�"h�� ��%J�"h����%B�"h����%:�"h�����%2�"h�����%*�"h�����[�H�% �H�=��"H���"H9�tH�Ʒ"H��t	�����H�=��"H�5��"H)�H��H��H��?H�H�tH���"H��t��fD�����=U�"u+UH�=ڷ"H��tH�=��"�I����d����-�"]������w����AUM��ATA��UH��SH��H��H����H�����H���/�H��H����A��L�(�H���LE�H����I��E1�L9�vpJ�LH��A�������A�A�L9��qJ�t��������0��	�I�QH�A�A�A�����<A�A�AI��E��u�=L�JA�L��1�H)�M��tI�UH��[]A\A]��H����H��t
�H��t�H��H������H���������H�VH��H��H��H��H9���Ѓ�땐H�V�H��I��E1��I��I��H������A�A�A��G��O�������0��	�H�A�A�A��G��O�������<��	�H�A�A�A��G���?A�A�A�I9�r����fDH���H��%i[]��A\A]�������0A�A�AE��uI�QA�A=���I�����ff.�@H����ATUSH��H��t�H����H���\��L���H���LE�H����I��E1�I9�smJ�H���������A�A�L9��EJ�t��������0��	�I�QH�A�A�A�����<A�A�AI�х�u�=L�JA�L��1�H)�M��tI�[]A\�@H���%i��ÐH�k�H��I��E1��I��I��H������A�A�A��B�D�b���A����0E��D	�H�A�A�A��B�D�b���A����<E��D	�H�A�A�A��B���?A�A�A�I9�r�����fDH���������H�SH��H��H��H��H9���Ѓ�����f.������0A�A�A��uI�QA�A=����@I������ff.�@AVAUATUSH��H��t_M��H��L�D$1�A��H��I���t���u@H�t$H����H��H��t-M��D��H��L��H���G�H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��t_M��H��L�D$1�A��H��I�������u@H�t$H����H��H��t-M��D��H��L��H����H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AUA��ATM��UH��SH��H��H���qH����gH�����H��H�����H�)�I���4@��?v��A��<?��I��H��u�M��1�I)�H����I���OM�A�H��I��I��N������4
�K��H��H���
��	�@�w��K��
���K����
��	�O��K��s��
��
2�O�L9�u�K�@A��H�I���ivLA�2�42�<�A�r�42@��	�@�1I���mA�rA�zH���42�:����	�Q��H��H)�M��urH��[]A\A]�f.�H����H��t
�H��t�H��H�������H��1���H��H�<IH�wH����H����H���6ND�M��t�I�4$H��[]A\A]�@M��I)�D���u2H��v]�|�b���f�H���H��%i[]��A\A]��1�H���>���L��L��H����H�<IH�w�c���H������H��A�8�<
@w��fDH�θ6N�H)�����DH�tI�>���fDH�w�/���H�����H��1��H�����������E1��$���H��I���(���AUA��ATM��UH��SH��H��H���iH����_H�����H��H���e�H�59�I���<@��?v�\�A��<?��I��H��u�M��1�I)�H����I���*M�P�H��I��I��N������<�S��H��H�����	�@�y��S�����S������	��Q��S��{����
>�Q�L9�u�K�RA��H�I���QvLA���<�A�Q���	��I���OA�QH�����A�Q�����	��Q�H)�H��M��ufH��[]A\A]�DH���H��t
�H��t�H�������H��H��1���H�RH����H����H���6ND�M��t�I�$H��[]A\A]�M��I)�D���u2H��vU�|�r���f�H���H��%i[]��A\A]��1�H���N���L��I����K�@�k���f�H���'���H��A��<@w��fDH)�6NH����H���P����H���@���H������H��1�H��������$���E1��9���H��I���M����AVAUATUSH��H��t_M��H��L�D$1�A��H��I������u@H�t$H����H��H��t-M��D��H��L��H���g�H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��toM��H��L�D$1�A��I��H���t���uPH�D$H��H�p��H��H��t9M��D��L��H��H���C�H�D$�H��H��[]A\A]A^�f.�1�H��H��[]A\A]A^�ff.�AUM��ATA��UH��SH��H��H���aH����WH������H��H���gA��L�8�H���LE�H���sH��E1�L9���J�TA�������A��H�F�L9��^N�L�A���������	�H�E�H�F�L9��`D�_A�J�LH�����A��GA����������	�H�A��GL9���J�t���������	�H�A��G�����A��G�����A��GE����G=H��D�H��1�H)�M��tI�UH��[]A\A]ÐH���GH��t
�H��t�H��H�������H���������H�VH��H��H��H��H9���Ѓ��H�V�H��H��E1��H��I��H������A�
�O��H�D�H���A����E��D	�Hc�A�
�O��H����A�
�O��H�D�H���A����E��D	�Hc�A�
�O��H�D�H��A����E��D	�Hc�A�
�O��H�����A�
�O�D�H��H�A����A����A	�Mc�C�
�O��H���A�
�O�I9��������H���H��%i[]��A\A]�������A��GE��uZ�==�G====H��f�W��A����D�_A����A��GA�����H�A��GE��u2�G====H������f�H������H������H�����������A��GE��t	H������==�G=H��f�G����ff.��H���gATUSH��H��t�H���AH���d��L�z�H�3�LE�H���5I��E1�I9���J��������A�A�H�C�L9��AJ�l��U��������	�H�E�$H�C�L9���E�a�EH��J�T���A�A�A�E����L9��)�J�t����	�H�A�A�A���������	�H�A�A�A�����A�A�A�����A�A�A���<I���A�L��1�H)�M��tI�[]A\��H���%i��ÐH�k�H��I��E1��I��I��H������A�A�Q��P�D�`���A����E��D	�Hc�A�A�Q��P����A�A�Q��P�D�`���A����E��D	�Hc�A�A�Q��P�D�`��A����E��D	�Hc�A�A�Q��P�����A�A�Q��P�D�`���A����E��D	�Hc�A�A�Q��P���A�A�Q�I9��
��������H���������H�SH��H��H��H��H9���Ѓ����������A�A�A��u"�==A�A====I��fA�Q��_����I���O�����2@��@��	�H�A�A�A����A�A�A��tlI������f�E�a�E���A�A�A�E����H�A�A�A��t!I�������A�A=I������f�A�A====I������==A�A=I��fA�A�����AVAUATUSH��H��t_M��H��L�D$1�A��H��I��������u@H�t$H������H��H��t-M��D��H��L��H������H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��t_M��H��L�D$1�A��H��I������u@H�t$H���c��H��H��t-M��D��H��L��H���w�H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AUA��ATM��UH��SH��H��H����H�����H���/��H��A��H�5��H���HD�H���f�H�߀<v�i@��<��H��H��u�H)�1�I��H���rI���;M�A�H��I��I��J�<��H��H���D���S����D	҈Q��S�D�S��F���E�D	�D�S�F�A��D	҈Q��S����A���S����D	҈Q��S�D�S��F���A��D	�D�S�F�A��D	҈Q��S�D�S����B
�Q�H9��;���K��A��H�I������L�B�D���O���D	ш
I�����6NA�L��H)�M��tI�$H��[]A\A]�H��xkH��t
�H��t�I��1�H���2���L��H�5�A��Jc�H��H�<�H�H�W��I��I)�D���u:H��vM�|�A���f.�H���H��%i[]��A\A]��1�����f�H�������H����< w���L��I�����OD�G�F���E�D	�D�GF�A��D	��
I�����OL�B���A���O���D	шJI�������I��������OD�OL�B��F��4>��A��D	�@��	�J�q�����6NH�W�f���f.��6NH�W�N���f��6NI���5����6N�2���fDH�W�#����H�W����H��1�H��uº���E1��Y���H��H�����H���f.�AUA��ATM��UH��SH��H��H����H�����H���?��H��A��H�5��H���HD�H���f�H�߀<v�d@��<��H��H��u�H)�1�I��H���rI���6M�A�H��I��I��J�<��H��H���D���S����D	҈Q��S�D�S��F���E�D	�D�S�F�A��D	҈Q��S����A���S����D	҈Q��S�D�S��F���A��D	�D�S�F�A��D	҈Q��S�D�S����B
�Q�H9��;���K��A��H�I�����D�H�QF�F��D�GF�A��E	�D�I�����6NH)�M��tI�$H��[]A\A]ÐH��xkH��t
�H��t�I��1�H���2���L��H�54�A��Jc�H��H�<�H�H����@I��I)�D���u:H��vM�|�A���f.�H���H��%i[]��A\A]��1�����f�H�������H����< w���H��I�����WD�G�F���E�D	�D�GF�A��D	ˆI����D�GH�QF�A��E��D�GF�A��E	�D�AI�������I�������D�GD�OH�Q�F�F��4>A��A��E	�@��D	�@�q�k����6NH�W�]���f��6NH�W�M���f��6NH���;����6N�1���fDH�W�"����H�W����H��1�H��u�����E1��^���H��H�����H���ff.�@AVAUATUSH��H��t_M��H��L�D$1�A��H��I�������u@H�t$H������H��H��t-M��D��H��L��H�����H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��toM��H��L�D$1�A��I��H�������uPH�D$H��H�p�_��H��H��t9M��D��L��H��H���s��H�D$�H��H��[]A\A]A^�f.�1�H��H��[]A\A]A^�ff.�AUA��ATM��UH��SH��H��H����H�����H�����H��H����A�� L���D��I��H��LD�E1Ƀ�H��u�����t	A�B:I�rI��B�<I�r@��@��A�;A�B�<I����A�;A�BL9�u�H��H)��1�M��tI�$H��[]A\A]�fDH��xSH���N����H���@���H��[]A\A]ÐH�LH9���Ѓ�A��t�H��v�H�T
�H9�H��r��돐H���H��%i[]��A\A]��1�H���_���fDH����H��t�H��u��H������ SH���I��H���HD�E1Ƀ�H��u�fD��t	A�B:M�ZM��B�M�Z�����A�B�I�����A�BL9�u�L��H)�A�1�M��tI�0[�H���%i��ÐH�tH9���Ѓ���tH��wM���5���I�0�f�H�T�H9�H��rݸ��@I��1�뎐AVAUATUSH��H��t_M��H��L�D$1�A��H��I�������u@H�t$H���S��H��H��t-M��D��H��L��H������H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��t_M��H��L�D$1�A��H��I���$����u@H�t$H������H��H��t-M��D��H��L��H�����H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AUA��ATM��UH��SH��H��H����H�����H�����H��E��L�;H��A��H�5��A��A��H����fD����vE���C�� �:H��L9�u�1�L��H)�H����H��H��w0�Nf.�D�C��H��H��H��B
�B�H��v��< u�H��H��H��w�H��H)�H���6ND��M����H����[]A\A]�H����H��t
�H��t�H��H�������1�A��tAH��t&H���������H�wH��H��H��H�RH9Ƹ6NE�H���������H��H��H��H)�@���6NE�H��H�GM���g���I�$H����[]A\A]�fDD��I������Ɂ�|����H���H����i[]��A\A]���1����H��tH��1�1���D����y���1��P����AUA��ATM��UH��SH��H��H����H�����H���o��H��E��L�;H��A��H�5��A��A��H����fD����vE���;�� �2H��L9�u�1�L��H)�H����H���JH���*f�D�C��H��H��H��B
�B�H��v��< u�H��H��H��w�H)�H���6ND�M����H����[]A\A]ÐH����H��t
�H��t�H��H������1�A��tAH��t&H���������H�wH��H��H��H�RH9Ƹ6NE�H���������H��H��H��H)�@���6NE�H��H��M���j���I�$H����[]A\A]��D��I������Ɂ�|����H���H����i[]��A\A]���1����1�1�H��u�D���t�1��\���DAVAUATUSH��H��t_M��H��L�D$1�A��H��I���d����u@H�t$H�����H��H��t-M��D��H��L��H���7��H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��toM��H��L�D$1�A��I��H��������uPH�D$H��H�p�o��H��H��t9M��D��L��H��H�����H�D$�H��H��[]A\A]A^�f.�1�H��H��[]A\A]A^�f.�@H�����H��SA����A��E!�H��tfE����1�A�L�
�L��%�\I��H����H����L9�t��t{H�WM�PA�u�H��M��H��H����fDE����H��1�A�L�
�����t7M�BA�t	M�B�H��I���M��I)�I�u��f��H��tL���t01�[�DH��tH���fD�H��tH��[�H��u���UH�����H��1�SH��H��H�L$�q����t
H��H��[]�H�t$H�����H��1�H�����H��H���<��H��H��H��[]�ff.�@AWAVAUATUSH��8H�L$L�D$ H�����H��I��I����I�ׄ�@��!�H��������E���D$A�@���D$1��(A�$L��L�pI��I���@I�����t{<+u@��uB<%u����A�~H�0H���D~tE�NL��B�DN��A�$%L���D$또A�$ L���D$�fD�D$1�A��D$A�$H�|$ptH�D$pL�(�T$���/���7�D$����H��8��[]A\A]A^A_�f.��p�<@~��ߍpɉ�D�O��@��@~���D�O�A�t+H�|$H���zA��D�L$�L��D�L$H���]E�$I�FI������H�|$ptH�D$pH���[���fD��t�E���D$A����D$1��!@I��I��I�����@�������A�n<+u����<%uΈL$����@���L$H��Dp��A�~H���DxtwD�]�@��@~A��A���E�X�A���F�@��@~��ߍF�A�E��t)H�|$H����A��L$�,���L$H����A�nI��I����/�����D$����I���D$����H�|$ H��t`A��D�L$����D�L$H��tGA�$%I�FI��I��A�vA�t$�A�vA�4$����@�����fD�|����E�$I�FI���D$���H�|$ I�VI��A�nH���O���A��H�T$(�L$�0����L$H�T$(H���*���I��I���9����AVE��I��1�AUE��I��ATI��H��UH��H�����SH��H��H�D$P�h���Y^��tQ=|tJ��u6H�t$L���9��H��H��E��jI��H�����M��H��H��L���"���XZH��H��[]A\A]A^�H��1�H��[]A\A]A^�ff.�H���'�H��ATA��U��SA��A��E!�H����E���I��E1�A�H���H�-���N���A���%I���DH��A��G�B�D�G�I��I��A�I��M)�I�A��tu��tqA��B�u�D�H����fDE����H��E1�A�H�L��f.���t/���t
I��A�H��I��I���I)�I�u��f��H��tL�	E��t7[1�]A\�f�H��tH���fD�H��tH�[�]A\�H��u����UH�����H��1�SH��H��H�L$�1�����t
H��H��[]�H�t$H���3���H��1�H�����H��H�����H��H��H��[]�ff.�@H����AVAUM��ATI��UH��SH������E1ɹH����E�ƅ�txH��L���L���M��uM�`������%H��A�H��A��C�A�2�C�H��L���H��H)�H��t��t��A�u�@�3H�����M��tI�M1�E��te[]A\A]A^�@�:H��蛽��I��H���4����/H��肽��H��t	I9�����H��t-�./H��A��f�C�����f�[�]A\A]A^�A����EM���^���H��L����2�A�t
H��A�H��L��H���H)�H�� �����u�����@��f�AT��I��1�U��H�����SH��H��L�D$�����tH��H��[]A\�H�t$L��������H��E1�I��H�����H��豸��L��H��H��[]A\�f�H���G�H��ATA��U��SA��A��E!�H����E���3I��1�A�H�-��L�%���M��A���%I��A�H����G�C��G�I��I��A�I��M)�I�A��������A��B�Du�L�G�� toD�L����E����H��1�A�A�H�-?��(DI���H��I��I���I)�I�t,��t(A��B�Du҃� AD��Ґ�+�L���G����H��tL�	��t8[1�]A\�f.�H��tH���fD�H��tH�[�]A\�H��u����UH�����H��1�SH��H��H�L$�����t
H��H��[]�H�t$H������H��1�H�����H��H��謷��H��H��H��[]�ff.�@H���AWA��AVI��AUI��ATUH��SH���H���…ɉ�@��!�H���)����L��1�A�L�=��L�
`���A� �S��"<�(��Ic�L��@�E&gt;I��H���@H��L���H)�L��t��u��EM��tM� ���H��1�[]A\A]A^A_��E&lt;I��H����f.��s;�E&apoI��H��f�E��끐�E&ampI��H����E�;�c����t;�E&quoI��H��f�U���>���fD����L�=����L��1�A�H�-��A� ��f.���"<���HcD�H���E��t���u�EI��H������fD�H��1�L�D$H���D�T$� ����D�T$L�D$H�L�
��I�H��}���DM��tI���fDI����H��L���H)�L���T������L�����A� �#���E��t���uqI����I����D����fDI����D��f��M��tI�H���[]A\A]A^A_�D1�H���1�1�L�D$D�T$�����D�T$L�D$H�I��#���M��u��ff.��AT��I��1�U��H�����SH��H��L�D$�����tH��H��[]A\�H�t$L���[�����H��E1�I��H�����H���Q��L��H��H��[]A\�f�AWAVAUATUSH��HH�L$H����H���I��H��H��������!�H�������A��D$�2f.�A�$H��I��I��L���QH���X���PL�k��&u��C���C<;�;H���A�B�E��J���;�'���I�RL9���I����@A��D$��uCfDH�D$H��tH�H��H�[]A\A]A^A_�I��D��L��H��t;E��t6D�cL�kE��A�ǀ�&u�A��;�YE���PH���QI��H�D$H��tL�0�D$��t�H��H1�[]A\A]A^A_��H�\$8H�l$(fDH��A�$&I��I��L���QH��������A�$딐��L��A�A���t�Ic�H�|$H9�t�<#��A��A���Ic�H�5�x"L�<�H�D$ M�������A�?�v���H�\$8H�\$ H�l$(L��M��H�L$0�f.�L��}�3���H��H��L��襮����u�H�D$ I��I��I��H�L$0H�l$(�D$A�H+l$H�YA�D$�����A�B�D��J�<��;������ ��OI�QL9�uI��A��D���2���I���L�iA��~FH�L$����H�S1�H�L$L�A�G�L�T��4�H���p�p�L9�t,���A�Dxu�L������H�D$�H������������~ݍP�L�����-���!vā���A�4$I��I���D$���L�l$ D��A����X���Hc�H�D$H9��G���A��#����I��D���1���Hc�H�5�v"H��H�������;����D�d$(I��D�|$0I��L���DI�A�?t7L��L��L���Ѭ����u�H�D$ H+l$�D$�PL�h��A�����D�d$(D�|$0D�����H�D$ �t$�PL�h��A�ǃ�������T$ �;���t$�T$ H�{L��F�1�L�\����A�DJ�M�����H���H�p�I9�u܃��2����xŃ��&���-���!�����������I���D$���H�|$ ���f�UH�����H��1�SH��H��H�L$�Q�����t
H��H��[]�H�t$H��賳��H��1�H�����H��H������H��H��H��[]�ff.�@H����D�H��AWA��AVE��AUD��A��ATE!�USH��t`E����I��E1�A�H�-t�L�5��DD��L�oM�c�D�*�X��\��U����Ic�L���E����H��E1�A�H�-��Ef�<"�8���<�I��A�DH��I��D�I)�I�D��t\E��tWE��M�SB�D
u�M����f��G\I��H��A�fDI��H��E�
L)�H�D��t	E�������M��tM�E����[1�]A\A]A^A_�����H�G"I��H��A��@�GrI��H��A��@�GfI��H��A��i�����GvI��H��A��Q���f��GnI��H��A��1���f��GtI��H��A�����f��GbI��H��A���f��GaI��H��A�����f�A�����GxI��H�*�H��A�F��D�O��G�����M��L�����M��tI���fD�"M��L���Z���f�<\��I��A���f���u�M������@�M��tI�[�]A\A]A^A_�M��u���f.�AT��I��1�U��H�����SH��H��L�D$�K�����tH��H��[]A\�H�t$L��������H��E1�I��H�����H������L��H��H��[]A\�f�H���H��t^E1�L��I��H��tHB�L�_����A��B�I����A��GL9�t��t
�G:H����L���A�1�M��t��tH��tH�RI��@��f�H�DI�1��DAUI��1�ATA��UH��SH��H��L�D$�κ����tH��H��[]A\A]�@H�t$L�����D��H��H��I��E1�H��蔺��L��H��H��[]A\A]�AWAVAUATUSH��(�L$L�D$H����I��H��H����H�E1�E1�H�D$H�$�1�A�L$�A	�E����H�D$I�GE�/A��I��H���+A��H9$�/���'E��u�D$E1�t��:t����A��H��P��u���t	��F�����.��f�%A�L$�A	�E���u���A��L���s����H�D$H�E1�H�$�Bf.�A��:uME��t)�`���H��@t��u��u	����H�D$A��H��D�;E��H9$tRE��tM�T$��u�����H�B�x��u��tA��Fv��tkA��fweE��t��fDA�L$�A	����H�|$t
H�D$H�t$H�01�H��([]A\A]A^A_�f�H�|$tH�D$H����DH��(�|[]A\A]A^A_�ff.��AVI��1�AUI�͉�ATA��H�����UH��S1�H��L�D$�a�����u(H�t$L���p���M��D��H��H�����H��H���5���H��H��[]A\A]A^�DH���?AUA�L�ATE1�USH������L�-R�H�-+������8L9�����tA��C�D@u=��tA��C�|x.�H��H��I����…�u�M��I)�M������u��t�����\I���DH��A��G��D�G��f���H�=�������,�L9�tN��t
A��B�@u,��t�<x"H��I�����u�L��H)�H��~��u��t�I��A���D�M��tM�1�E��t []A\A]��M��tI���[�]A\A]�f.�AUI��1�ATA��UH��SH��H��L�D$�Π����tH��H��[]A\A]�@H�t$L��苪��D��H��H��I��E1�H��蔠��L��H��H��[]A\A]�ATI��UH��S����H��tDH��H��葦��H�UH��L��H9�����H����s�����$H��1�H���C�����[]A\�@�[��]A\�f.�f�H��H��t9H��t1H�L�H9�s'����u� fD����tH��H��H9�u����ff.�f�AWAVI��AUATUSH��H��(�H�T$<	t< u@H���< t�<	t�H��A�I��fDD�L$��tP<"��<'��H��1�f��qH�Q<\�P���< ��<	����H�ф�u�A�A�D$Hct$H�|$I��H�����I�A����E�o�E1�J�<�I��H�|$fD��� u�H����� t�	t�H�K��"�H��1���'uH�SH�;H���U����H���%����`�� tJ��	tE�QH�ل�t6H�Y��\u��y@��'�,I���"H�QH��H���QH�ل�u�H��H��H�|$N�< H)�H��H�$�ާ��H�$H��I�I�J�< 蘡��I�J� �H�ʄ�u�EDH��H��H�ΈB��FH����t(H�q<\u��A��tH���B��FH����u�D�L9d$�	I�I�����fD<'�@���@��	t@�� ��H���< t�<	t�A���������������u�<"���f����������u3��"���������D@��'w�I��s��AH�Q������'�i������f���BH�J���[������fDH�;H�K�U������H���g����뾋D$�P�I�H��H�H��(1�[]A\A]A^A_É�����ff.��S�/H���2���H�xH��H��[HE��f�ATI��US���t3H��誴��f.�H���DQ uA�$I��H���]��u�L��[]A�$A\�f��F��~HATI��UH��S1��H��9]~'H�E1�L��H�<������u�[�]A\��[1�]A\�1��ff.��F��~HAT��UH��SH�^L�d��
@H��L9�tH�;H���L�����u�[�]A\�fD[1�]A\�1��ff.�USH��H��t}H��txH�H��tE���tQ�uK�8�u@H���8�t���tIH��H�����#���H��tF�H��H�EH��H��[]�f�H��H��H��1�[]�ݱ��D1�H��H��[]�@H��蠠��H�H�E��AWAVI��L��AUA��ATUH��SH���a���L�d$H��L��H�D$����H����H���fDL��H�����H��H��tuE��u�;t�L�����H���fD胲��L�8�
fDH���A�DG u�H����H�D�H9�v�DH��H9�w�A�DW u��@�fDH��[]A\A]A^A_ÐAVA�ֺAUI���ATI��H��UH��S���I��D��L��H��L��H���C���H��[]A\A]A^���1���u�]D��
t;��H�τ�t'�wH�O��
u���@��
u��WH�OH�τ�u��f.�����@��
u��WH�O������L�
s�H��A�QA�A)�u4���t+f���H��I��A�IA�A)�uE��u��ff.�f�H��tT��L��I��A�JA�B)�u8E��t3��%��D�H��I��G�BA�BD)�uE��tH9�u�1��@AWE��AVI��AUI��ATI��USH��H���n���D��H�t$H���H��襙���U��t3H�L$H9�tC�;t>�9u9��"tTL9���L9����u4H��x/I�1�H����[]A\A]A^A_�f����f��"��f�H��������H�H���v��ff.�A�
H�����1�����ff.��S1�H��A�
�����H��H�|$����uH�T$�H��[�AWE��AVI��AUI��ATI��USH��H���N���D��H�t$H���H��腘���U��t(H�L$H9�t3�;t.�9u)��"t4L9�|GL9�BI�1�H����[]A\A]A^A_�@���f�H��������H�H���v����"뼐H��������A�
H���A����SA�
H������H���H��H�|$������uH�T$�H��[�ff.�ATI��USH��H�����L��H��H��H���}���H��HD�[]A\�f.�AWA��A��AVAUATI��UH��SH��h�A��A�À�*�����tnH�D$E1�E1҄���A���E������\��]</����/���]I��H���A�$E�߄�t	E��t_</u[����H��h[��]A\A]A^A_�A�$E��D�L$E��M��D�\$+����E��t��/�[�����\uA��u
�}/�F���H��h�[]A\A]A^A_�fDH�D$E1�E1�D�ȃ��D$A���UD�L$ L�T$D�\$E�����/L��萛��D�\$L�T$H��I��D�L$ ��D��D�L$L��E���D�\$+E�����D$�����E��M��I��M9�������*t	M9������E��t��/���\u�|$�7E1ɀ�*t��?u3f���*�'M9������I��H���]��*t݀�?t�E���oIc�D��M��M��H�D$ �D$���D$,M9��„���������*��E�<$��t#��/��A��/����\u�|$�s��[����?����\u$�|$tD�E��tH����f.�D8����D$,���D�T$@D�L$8�L$0�H���I��H��L$0H�D�L$8D�T$@�DPu�Dp��D�T$HD�L$D�L$@H�T$8H�t$0���H�t$0H�T$8H�D�L$DD�T$H��9��L$@��E������������1�fD����H��I����ul�]���A�<$.�������.����\�Q���A���G����}.�=���H��I���]�i���fDE��t���u�f.�E������H�D$ I��L�I9���H�l$M���]�����A�����DL��舗��D�\$L�T$M�D�L$ �+�����]E����������fD�}L�E@��!��@��^����b@��]��@�������@��\u�|$����t
A�8/�����A�x@��-��E�E8�D�\$0��D�\$,E����D�T$\D�L$X�L$T@�|$PL�D$H�t$D�T$@����I��L�\$0�T$@H��t$DH�L$8L�D$H�|$P�DHD�L$X�L$TD�T$\uB�DXtgD�T$\D�L$X�L$T@�|$PL�D$H�t$D�T$@L�\$0苨��H�L$8L�\$0H��t$D�T$@L�D$HB�<�9<��D��|$P�L$TD�L$XD�T$\I��@����@��]������I�hI��1����DL�E�}�����/�w���A��/�e����h����}/�IE1����fDE���������t
A��/������]I��H������������1�������]��/���H�����f.�����H���1�D�D$�>f.�</t[E��u<\�<*�|�N��H�~A��<[t]��t0H����A��E��u�<*�Q�NE��u�<\ũ�A�҄���Ic�I�I9�����M��M��H�l$I)���fD��!����I����^��<]t��tI<\u�|$��E��tA�;/t/A�C<-��I����t<]u�I�{A�K�C�����< �0������\���</� ����|$+����A���A���f��N��/�$����-���fDH�~�N����}/�����M��M��A�����A��L��M���}�������H������L�^�F�
���Hc�L�I9������H�l$M�����A�@<]�f���<\u�|$�u�L��8H�D$0@���)���@��/u�|$+����E�E8�	D8����|$,D�D$8@�|$X��D�T$TD�L$P�L$H�t$D�T$@�F���M��L�D$8�T$@H��t$D�L$HD�L$PL�D$8B�DXD�T$T�|$XuB�D@uL��B�D@teD�T$\D�L$X�L$T�t$PL�\$H�T$@@�|$D跤��H�L$8L�\$HH��T$@�t$PD�L$XF��D;�D�T$\�L$T|H�|$DD;��N�H�D$0L�@�x����A�x�
���I�����1����E���/���</�'�������E��D�L$E��M��D�\$+A�$��u����f�E�{A��]�o���A��\u�|$um�L�D�E���o���A��/u�|$+�^���L�X�@�3���A�{�F���I������E1����E��D�L$E�ֻ\M��D�\$+�g�����1�����f����tY1�<[t&~1<\t=<]u	��u-D�GH�W��t4H��<[uڃ����<*t<?uظ�f��H�GtH���1��ff.�f�AWAVI���/AUATI��USH��H���\���H��H����H��H��L��H)�H�]�K���I�ź1�H�l$ L��贊��L��H�|$L��I��A���A�Ņ�t �>�H��$�1�H���>�����t:H�T$�H��訖����t�H�|$�ʛ��H�ĨD��[]A\A]A^A_�DH��$�I�>H�t$苚��H�t$L��I��論��I��fD�\H���s���H��H������L�-S��#���f.��I��A���A��A����Xty�����L���H9�v0Ic�L��f�H��H��H!�A�
���H��H��u�I)�M��fDL��L��fD����H��D!���A����u�I)�M��f������L���H9�w�L�آ�fD������f.�AWf�AVI��AUA�NATUSL��H��8��NDN�f/�L$D�l$�H�H�l$ H������f��D$�D$ f.�zu}�t$f�f/������E1��Y��T$�|�f/�f(��t$(w��f(��D$A���Y�f/�w��D$(H���L$�@��L�cPE1�M���T$�H���^D$I��A���J����D$(�X��YD$�,���0A�A��Pt�D$ f��f.�z�u�M9��kM)�1��	@A�/�+H��L9�u�H�HcL$Ic�L�<�L$L���LD�I9��E�.L�cPL9�wRL9�sM�=Q�L�l$(�|$�	@I9�t/�D$�YD$L��H��胎���,D$(�D$��0�E�I9�s�M9���A��PL��A�fD��9~�0H9�v;�p�H���V���9�A�H��8H��[]A\A]A^A_�H��E1��!���D�T$�1A���u
I9�vA�0I������fWR����DD�l$A��E�.����CO�z����H�����������I��H9�wK@��tE�H��A������@�׉�H��A��G0��D��E�D)Ȉ��	w�H)�H��I��@��A�����H�L9�ve��ueH��I��H��?I��H���LI�I���������H���@I��L��H��I��A�A0H���<��)��I��	w�H)�H��I��f.���t��@���������1�)��$���ff.�AWE1�AVI��AUI��ATE1�UM��SH��L�L�^H��$��H�|$H�t$PL��M��H��$�H�L$(HDŽ$��D$LH�D$8�D$H�t$X�ODH��t5L9�r)L�$L��H�D$I�.��L�$����I�.M�fA�E�EH���D$L���CL�k����
<%u�L�$I�]�}���A�ML�$H�I��H��DJ���D$E1�E1�A��$�D$0�D$  <lt4<qt0�<hu
�C�H��<xw$H�=O���Hc�H����C1�H��<xv��D$~%1�L�D$~�D$HDŽ$��$�D$  �5D1�E1�E1ҹ A��"<+t$<#t0< t<<0uH�0H���<-u�E1���A����A�������f��L$ �ȉt$0�DJ�
�D$<*�S
�$<.����SI�	H��DQ�&��*�H���$H�D$8���@�D$�����D$H��[]A\A]A^A_�I���$����D$~%�$1�L�D$~HDŽ$��D$  fDD�\$�H��$�L9���|$ 0������H��tHL9�r0L�D$@L��H�D$D�\$0I�.�Ѕ��X���I�.M�fL�D$@D�\$0A�H���E�H��$�H��D�l$I��I��H��$�A��E�L�D$0L��M��D�\$@E��D�l$ H�\$H�\$�H��t$H9�rI�.L���Ӆ�����I�.I�vD�mH��A�GD)�I��L9�$�r�H�\$L�D$0�D$M��D�\$@I��f��<$�^	D�؃��D$�����L9�$������E�oL�D$L��D�d$H�$D��D�l$ f.�H��t)H9�rI�.L��H�D$�Ѕ��!���I�.I�ND�mH��B�#D)�I��L9�$�r�H�$I��L�D$�D$�*���H�t$(���/��ƒ�HV���D$~���H�t$(����r
��/�Q�ǃ�H~��H�?�D�T$@L��$�H��$�D�\$0�e���D�\$0D�T$@I���$����
D�l$LE���zE���q�A�@�0I���$A�@H��$�1��o����$����
H�D$8H���SA�����$H�t$(�V�����
�Ѓ�HF�VH�t$P�D��H��$�L��$��D�T$hD�\$`D�L$@�X���D�L$@D�T$hD��$�E��D�\$`��H��$�Ƅ$�-H��$�H�|$@�<$���3Hc׀<0�&H�t�D��)���H���~0�A��A9�u鋴$�����
��)׃���D�F�D��$��8�A.@�9H�yH�<$��~9D�J�1�I�yH�|$`�f�H���|@�|H�zI9�u�H�L$`H$H�$�eH�xE����
H�$H�O�@+A��c��
D�����Q���D�����)Ѓ�0�D�����QH�yD���H����D�����)к����k�d)Ɖ������0�A�D���gfff���D�����)Ѝ��A)�A�@0�<.�m���$���-�aH�t$@D�T$hD�\$`H��H��H�4$�@���E��H�4$D�\$`H��D�T$h�\�T$0I���ڃ� H��$�E��t1�.L��H�L$@D�\$0�$�"����$D�\$0H��H�L$@�_�;G�����5A�U�M�E�H��$��$���H�t$(�F=��A�ƒ�HV�F�f.��bf(�fT
��f.
��	D�$��E��HE|$8�D$`�<$<f�H��$����D�T$lH��$�L��$�D�\$hL�L$@�N�L�L$@D�\$h�H��D�T$lI��DH�u�$H�F��$�����E����H��$�H�L$@H��$��V��t$�H��H���Q����u�|$`f���D$`���$�D�H�D��$�E����D��A��������D1�)�H�D$PL�@
��։�I��A��F0���<��)�A���	w�H�T$XA��A��A��+L)�D�IH����H��H�r�H��t L�N1��	A�DH���H�zH9�u�L�H�D$@�-H��H)���$�H��$�����L�l$@I������H�t$(�����
��/���ǃ�H~�H�?L��$�H��$��H��$�D�\$0�h�D�\$0I���$����
�$1�����H�t$(���/�K�ƒ�HV�L�M���QD�$E���F
L��D�\$@L�D$0����H��$��$1�L�D$0�D$  D�\$@����CL�k<I���f<m����<p�H<t��H�t$(���/�KH�t$(H�FH�PH�VH�H����H������L��$�H�
�H9���H��I����H���A�u�H��$�L)�H��$��$����L���$1��D$  ���H�t$(������/�5�ǃ�H~��H�?�D�T$@L��$�H��$�D�\$0�3�D�\$0D�T$@I���$���VE���M���A�80�oA�@�01�I��H��$�D�$�K���H�|$(����>��/��ƒ�HW�H�HcT$H�1��$����H�t$(����.��/�(H�L$(H�yH�GH�AH�?1�D�\$@L��$�H��$�H��$����D�\$@I���$���i��$�����E����
�D$0���c���� �fDH��$�H��������L$D�\$0L�L��H�$M��M�ă�L�|$M��I�։�fDH��t-H9�rI�/L��H�D$�Ѕ����I�/I�A�EH���E���D)�D�I��M9�u�M��H�$L�|$I��D�\$0M��D$���<S��<T��H�L$(���/��H�|$(H�GH�PH�WH�H���
H�8L��$��H��$�H��$�D�\$ ��4$D�\$ I�����e���H�D$8H9�$��H��$�L��1��D$  �1�<A��
���EI�.���<Bt<F�1H�t$(�<B�R<F����/�aH�|$(�Ѓ��HGH�H����H�8H��$�D�\$@����H��H�D$0L����{��H��$�����D���sH�KA��0Mc�H��Drt(���K�4�H����0H�L�<p�1H��Dru�H���D$��H�|$(���/�*�ƒ�HW�Lc:H�S�CE���0H���D$�n�D�l$����	���
��/�
H�t$(�ƒ��HVH��t$�$1҉0��H�L$(H�QH�BH�AL�M��������$1�L���HDŽ$��D$  �y�H�t$(�$A�H�D$8�V�������H�L$(H�AH�PH�Q����H�|$(H�WH�BH�G���H�t$(H�VH�BH�F���H�|$(H�WH�BH�GLc:H�S�CE������A��H���D$E1�Mc��5�ǃ�H~�����H�L$(H�yH�GH�A�G���H�L$(H�yH�GH�A��H�t$(H�~H�GH�F�����$�D�ʅ����������D�F�D��$��8�A.@�9H�yH�<$�������AeH�yA�H�$H�OA)�D��$��@-A��c�5���A��	�����H���?���f.�H��$�H�L$@H��$���-H���M��I9������$���$1�L�_�HDŽ$�����I���G
��/��H�|$(�ƒ��HW��D$LH�Y��;XH�
o�HEȋD$LL��$����I�������A�u�H��$�L)�H��$��$���X�H�t$8��H�FH=HB�H;�$��2��I��A�0H��$�H��H��$�H9�r���������
��/��H�t$(H�VH�BH�F��D$LH�y��;XH�
��HEȋD$LL��$����I�������A�u�H��$�L)�H��$��$�������H�|$8��H�GH=HB�H;�$�������I��A�0H��$�H��H��$�H9�r��W������N������/��H�|$(H�WH�BH�G�
��L��$���������$����1�)���щ�I����A0���<��)�A���	w�H��$�L)�H��$��$�������H�L$8��H�AH=HB�H;�$��q���DI��A�0H��$�H��H��$�H9�r��F������������/��H�L$(H�QH�BH�A�
DŽ$�L��$�������f.��щ�I����A0���<��)�A���	w�H��$�L)�H��$��$���>���H�t$8��H�FH=HB�H;�$����DI��A�0H��$�H��H��$�H9�r�1����ҍ2H�|H��H���@�0H9�u�2H�TH�L�.E�����A���$���-�|H�L$@D�\$`H��H��H�$��t��E��H�$D�\$`�H��$��+I�̀;G���eL��D�\$0�$�u���$D�\$0H����������sH�S��0Hc�H��H�|$8�Dq��H��f�H�����:H�4���0H�H�4pH���Dyu�H�t$8H���$�C�� I�;eL��D�\$0�$�u���$D�\$0H���
��E�����	D�B����1D��H��D9�t H��D�H�D�	9�u���A.H��D9�u�9��T����A���H�|$(���/���Ѓ�HG���$�ҺIH��Hc�H�D$8��q�H�|$(H�WH�BH�G����$A�H�D$8���+�
���L�l$@D�T$`D�\$0I���$L����r���$D�\$0H��D�T$`���+I����H�L$8HDŽ$�H��t*A���t$��H��A�T���tH��$�H9�u�1��D$  �Q����$���-�@H�t$@D�\$`H��H��H�4$�Cr��E��H�4$D�\$`H���C	H��$��+I���
�D�$1������/�0H�t$(H�VH�BH�F���/�eH�|$(H�WH�BH�G���H�t$(H�FH�PH�V�Z�����/�H�L$(H�QH�BH�A�����/��H�t$(H�VH�BH�F���H�AA�D
.H��$�A�D
����/��H�|$(H�WH�BH�G���H�t$(�ƒ�HV��e���H�|$(�ƒ�HW��0���H�L$(H�QH�BH�A�z���H�L$(�ƒ�HQ��E���H�|$(H�WH�BH�G���H�L$(�ƒ�HQ��x�H�t$(�ƒ�HV��%���H�|$(�ƒ�HW�����H�|$(�ƒ�HW�����H�t$(�ƒ�HV����L�l$@D�\$0�$I��L���Sp���$D�\$0H��$�����Ѓ�HF���Ѓ�HA��Y�L�l$@D�\$0�$I��L���p���$D�\$0H��H��$����H��$�Ƅ$�.H�L$@H��$�����/���Ѓ�HF�H�H���y�8��L��1��D$  L���HDŽ$��$�Y�H��H��D�\$`H�4$�eo��H��$�H�4$H�|$@H�PH��$�H��$��u��D�\$`DŽ$�E���x�D$0����L�D$@�$1�I�������/��H�|$(�ƒ��HWH��L$�$1�f���H�|$(���/�F�Ѓ�HG�H�H�������8��D�\$@H��$������H�t$(���/�K�Ѓ�HF�H�H��������L��$�A�����������I���I�p�A��A0���<��)�A�@���	w�I���F�.��A��������I���I�p�A��A0���<��)�A�@���	w܉�I���F�.A�����������I���I�p�A��A0���<��)�A�@���	w�I���F�.���������Ӊ�I����C0���4��)�A���	w�H��$�L)�H9D$8s�$tH�D$8H��$��B�H�L$(���/���Ѓ�HA�H������L��$�H�
ƀH9��rH��I����H���A�u�H��$�L)��H�L$(HDŽ$����/�|��L���$1҉L�U~��H�L$(���/�9�Ѓ�HA�H�H��������qH��$�A��������L�ˉ�L�K�A��F0���<��)��C���	w�A�A�:Hcq(H��$�H��D�\$`L�L$0H�L$ H�|$@�i��H�L$ L�L$0��D�\$`�BH�T$@L�C��2H����������!�%����t������D�H�rHD։�@�H��H+T$@�y
�yD�QHE��u�yL��u
�yP���\I)�A�A�]��I��A�[I�p���>�������P�H�D$@�����=�H�D$@�D�f�D��)�D��/�NH�L$(�ƒ��HQ��D$L��1�H��$�H��$�D�T$lL��$�D�\$hL�L$@�E��L�L$@D�\$h�D�T$lI��DJ�l�����$�������H��$�H�Ɖ�$���H�|$@H��$������$����u�Hc�H�|$@�4$H�JH�H�L����E������������f.���/�H�|$(�ƒ��HW�
�{��/��H�L$(�ƒ��HQ�
�:��$1�L��{HDŽ$������/wnH�t$(�ƒ��HV��D$L�<�80�����.H�������+0�A0H��f�A�����+���H�t$(H�VH�BH�F�d���H�|$(H�WH�BH�G�H�t$(H�FH�PH�V���H�L$(H�AH�PH�Q����L������H�L$(H�QH�BH�A���H�L$(H�AH�PH�Q���H�L$(H�QH�BH�A����H�t$(H�VH�BH�F����D$0���dH��$�� I�����80t�.H��H���A�0��u�DŽ$����T$0���,�;GH��$��y�I�ͺ ��H�t$(H�FH�PH�V���H�D$(L���$1�L��yH�@���A01�H���5�1��>�� �l��<$Ƅ$�0����QH��$�Ƅ$�.��$�H�|$@���w��H�tH��$�H���A�0H9�u��H�|$@DŽ$���H�L�1���H��{��I�������
A�u����H���$���H��$�1�I���]�H��$�1�I���|�H�\$@I�x	H��H�I�@��H�L�H�L�H��H��H)��H)���H����H�|$(H�GH�PH�W�R���E���vH��$�Ƅ$�.H��$�H�t$@�b���L�C�H��$�A�A�?L)�H��$���H�t$@�.H�L�/���H�t$(H�FH�PH�V����/w~H�t$(�Ѓ�HF���H�Rz��I�������
A�u��$�I)ЉЃ�sT�������	�H�L$@�A�����H�t$@�T�fA�T����DH�L$(H�AH�PH�Q��H�t$@I�xH��H�I���H�L�I�L�L��H)�H)������H���H�L$@�A��T�A�T��w�H�|$@���D��D��a�M����DH��$�H��$�H�t$@��H��$�����SH��H���H�L$HL�D$PL�L$X��t:)D$`)L$p)�$�)�$�)�$�)�$�)�$�)�$�H��ucH��$�H�L$H��H�$H�D$ H�=��H�D$0H�D$�D$�D$0H�D$(�gf�������D�H���[�DH�D�H�<$H�L$H��H�D$H��$�H�=���H�D$ H�D$0�D$�D$0H�D$(�f��H�$��ff.�SH��H��H��u3H��H�=Y����H�$H�D$�e�����D�H��[�@H�D7�H�<$H���H�=��H�D$�e��H�$���D��H��[�f.�H��tKATI��UH��1�SH��H���Th��L��H��H)�H��HE�H�s�;g��H��H��H���=j���[]A\�@1�H���f.�H��t3UH��H�rSH��H���f��H��H��H���i���H��[]�D1�H���f�H��t+UH��SH��H��H���f��H��H��H���i��H��[]�f�1�H���f.�H��t+UH��H��SH��H����b��H��H��H��[H�P]��]��f�1��ff.�f�AVAUE1�ATI��US1�H�ĀH��$�H�t$XH�D$H�D$PH�T$`H��H�L$hL�D$pL�L$x�D$H�D$�5��ƒ�H�D$H�:H��t9�/b��A��Ic�A��H�D� HËD$��/v�H�T$H�:H�BH�D$H��u�H�sL��1��e���D$I��H��$�H�D$H�D$PL��H�D$�=fD��HT$��L�*�D$M��t@��UHcŃ�L�t� H��L��L��L��Ih���D$��/v�H�T$L�*H�BH�D$M��u��H��L��[]A\A]A^��L���Ha��I���ATUSH��toH��H��H��E1�H���LBH��H��u�I�pH��tL��d��I��L��H�3H�SH��H���g��H�K�H�H��u��L��[]A\�DH��tH���bd��H��I���L��[]A\ÐAVA��AUI��ATI��UH��S��[��D��L��L���H���g��H�E�[]A\A]A^ÐATA��UH��SH���[��D��H��H���[]A\��f��fD�
1���[��@S����c��E1�H�H
��y��A��@
������DH���H�q�������)Ã�0�Y��Ӆ�u�E��t�F�-H�q�H��[�ff.�f�SH���Rc��E1�H�HH��y	H��A�H����������@�DH��H��H�q�H��H��H��H�H)Ã�0�Y�H��H��u�E��t�F�-H�q�H��[�ff.�f��{���ff.�S�PEH��H���D$	KMGTf�D$
�D$H���0��H���~}H��H��
H�������A�KH��~H��	���������=�g��	A��1�H��r�H���vf����x.H��H��[�f���1�H��r�H���Hf����y��****H���CH��[ÐH��E1���H�t$	H��H�FH��
H���g�ω�D�NH�с��3���%E�ȾH�߃�H�SrH��1���e����x�H��H��[�fD�  - H���FH��[�DH��H���z���DAWI��AVAUATU1�S1�H��(H�|$�T$��o��L�T$L��L� M���Hc�Hc�A����A�D���H��C�<lf�� u�D��G�tfA�� t'��Hc�fDD�4��H��G�tL��fA�� u�f���
fA����Hc�L�Hc�L�H�D$�A�<DI��A�I��A�Df��f%��0�#��0�f���nf��t}�L$H�L$A�1��T$L��@E8����������D�B�<F�I��A�<|M��f��C�D\u#�T$�L$f��tC�����H��([]A\A]A^A_�I��f��u��H��([]A\A]A^A_�E�u��T$�L$��u�D������D$��tH�t$�U��H�t$H�B��B��8�|�������A���f�~����D��*����f��tXf���c���E8��=����T����T$L��L�\$�f.��:E�;I��A�DM��f%C�DTu �T$f���������:���1�����f����E8�����H��E8�~������ff.�1��9���f���&���fDAUI��ATI��UH��SH��H�����u@��u�qf��uH��@��t\L��H�]�[��H��u�I�]�u@��u�)@H��I�]�3@��tL���x[��H��t��I�EH��H��[]A\A]�DH��1�[H��]A\A]��H�*�d����L�I���t'J���M��tT@��H������W��H9�u�Ð���t2I��fD��I�������A�„�u�I)���L���É�E1���AWI��AVI��AUATUSH��H�G@H�T$H�$H����H�t$L����A��I�GD��A#W4H�,�H�]H��tQL�l$�f.�H��H�H��t5D9cu�L9ku�H�{L��L����]����u�H��H��[]A\A]A^A_�@H�<$t�I�GHH��tPH�I�WHH�T$H�$H�D�`L�pH�PH�H H�EA�G0�fD�W8H�t$L�����A���7���I�?�(�3\��먐S�^H��H��� \��H��1�[H���B[��f�UH��SH���rT��H��PH�D$��[��H�T$H��H��H�(H�@HH�H�C0H��H�� 1�H�T$1�1�1؃��C8�x���H�C@H�CH��H��[]�f�SH���_��H�X@[ÐH�GH�GH��u,H��W�q49�r)L�A���9�w"I�ЍJH�GH��t�OH�H�GH���@�W�@SH�FH��H��t
� �[��H�H���@H�@H�@[�f��fDH��tH�GH�@H�H��tH�GH�@H�H��tH�GH�@ H��ff.�@H��1�1�H�t$�NY��H�D$H���@H��1�1�H�T$�.Y��H�D$H���@H��1�1�H�L$�Y��H�D$H���@1����f�UH��SH��H���F4�P�F0H��H�t
H���Z���U01�E1�H��]4L�XP�P0�U8�X4�P8H�U@H�@HH�P@�U4L�XH�m��L��PDD��I�4�H�T�H��tH���D�B��H��I��H�H�D�AL�BL�AL�BH�L�AL�B H�L�A H�6H��u�A��H�D9�s�H��[]�H��1�����H�H��tH�@ H���@ATUH��SH����H�H��t�K0H��t�C4H�j 9�r&[]A\ÐH�2��H�0H�CHH�H�SH�K0[]A\�@�lH�;�����1�H��I���5O��H��t#H�P��H��#JI��H�1H�2H���c��H��u�L�c�k4[]A\Ð�G0�ff.��UH��H��1�SH����N��H��t.H��DH�C1�H��H�PH�p�:Q��H���bc��H��H��u�H��[]�AWI��AVI��AUATUSH��H��HH�t$ �PH�|$0H�L$(L�D$8�X��A�v49s4I��L�8Cs4H�@HH�C@I�D$@�C0A�t$4A�D$0A�F0C09�s	�t6A�t$4�C8H�|$0A�D$8���H�D$I�D$H�D$ �@0C0��D�S4L�KE1�E1�H�\$D��I��H��tUE�\$4I�|$fDD��H�p�HA��H��H��H�rH�pH�rH�p �JD!�H��H�r H�1H�2H�H�H��u�A��E9�s��D$D�l$H�L$ �D$H�QH��H����I�D$@H�sH�{H����ЉD$I�D$�T$A#T$4L�{L�,�H�kM�uM��u�@M�6M���|M9~u�I�~L��H���W����u�H�D$(H�K H����L�L$8M�F L��H��H�|$0��I�F H�H���[���H�L$ �D$�D$9A4�'���H��HL��[]A\A]A^A_�f��D$H�t$H�S H��H��H�Ƌt$��H�hH�P I�UL�x�pH��L$I�EA�D$0�A�T$8�����D$��I�N �e�����H�|$0H�4�H���U��H�D$����ff.�E1�1��_��fDATI��UH��SH�� H��H�$�D$H�D$H�D$�\`��H��t?H���f�H���H`��H��H��t(H�CH��H�H H�PH�pA�ԅ�u�H�� []A\�DH�� �[]A\�f.�H��f.�f������H�H9r�����ff.��1�H9>�������F��ff.�@ATUH��SH��ttI��L���T����H�xH��H��H�Hǀ�H��1�H)�������H�L����J��L���H�CHL�chL���H�]1�[]A\þ���V��H��H��u޸��f��
Z("��w��("��q��5?("!��@H���Ob������("!Љ5("H���f�ATI��USH��H�GH;Gs$H�H��H��H�C1�L�$[]A\�fDH��t[H�{H�,H��H��H��tZ�ZS��H��H��tzH�CH�3H��H��tH���FV��H��H�CH��H�H�k�fDH�{�� H��u�H�;�Y��H��H��tH�CH�H�kH���L���D[�]A\�ff.�H���GAWAVI��AUATUH��SH��H��H�v0H��tH�~81�����H�C H��tH��H�C H��u�M��L�mPA��f�H�CH�SH�BH�CH��tH�PL�cM����E����H�;H��tA��H��L���k���H�u H�mH����H�~t�DH�~uGH�FH�E H��tH�@ L���$����EH�u ���EH��u�H�E8H�E(H�E0���D�H��[]A\A]A^A_ÐH��L������M���a���L������@1�ËE릋E�AWAVI��AUATUSH��H����H��H��I��E��H�D$E1�H�CH��tOH�0H��A�ԅ�u@H�[E��uoH��u
�P�H��H�CH��u�I�H��D��[]A\A]A^A_��.H�[A��H��u�H�\$H��u��I���H�[��f�H�\$��E1���@H�G`H��tH�WPH��H�G`H��H��tÐH���H��t�@�ZP��f.��@�6U��fDAUATI��USH��H���H���I�D$HH��H�X�@��~&H;3tK��H��H��H��H9+t3H��H9�u�H����O��I��H����H��E1�[L��]A\A]�DH�SH�B�R��~(�xtS��H��H��H��	�xt:H��H9�u�H���O��I��H��t�H�{�V��L�(�@H��L��[]A\A]�L�(�@H��[]L��A\A]�I�|$H�FV����I��$�H�(H����E��H��H�C�H��H��[]A\A]��S��ff.�H���tnH�GHH�x�@��~N�H�H��H��H�H�WH�B�R��~(H;0t5��H��H��H��
DH90tH��H9�u�H��H9�u����@�H���@E��H�E1���ATUSH��H�� H���|I��H9t<H�G@H��t3H�l$H��H��D�D$H���V��H�D$H��tIH�8D�D$��H�l$H�OH� H��L�����H�D$H��tH�H��tH�H�� []A\�f�H��tH�H�� 1�[]A\�f�E1��H����A��5���DH�A��"���f�H�G(H��tH�@�f�H�H��tH�@H�H��tH���1��ff.�f�AWI��AVAUI��ATI��USH��8�o�G�L$L�D$�������*�����@M�w M��tbI�GpH�D$�'@�D$����|$�I�v�]I��M��t0I�FH��tH�0L��A�Յ�t���9���M�v��M��u�I���E1�H�D$(H��tI�WpH��I���H�,�H��tgL������H�UH�PH��tH�BH�T$(H�EH�hH�@ H�@(H�@0H�PH���BH�B L� L�x8H�D$(I���H��u�A;_m�H�j H�T$(H�hI�o0I�o H�@(H�@0H�@H�@ H�PL� L�x8H����H�B H�D$(A�G��A�G9���L�����L��H�����I�W H�E(H�E0H�EH�E H�EH�UH�EL�}8H���G���I�o8I�o(�>���f���A9_����������u��
���DH�|$L���C����U���fDI���E���I�@H��tR�R��H�D$(H��tCL��L�d$(H�8I�uE1��H��i���I�@L��H�E0H��H�h(H���O��H�D$(H��u�I�GH��8L��[]A\A]A^A_�fDI�G H�T$L��H�D$���I�G H;D$�����A�oI��ILJ����g�����]�������������@��9����������u�������������f�I������ILJ�E1��-���I�v����@H�H��tH�@H�H��tH���1��ff.�f�H��tH���1��ff.�f�H��tE1�1������1��ff.�f�H���V���AVI��AUI��ATUH��SH��H�@I��L���lQ��H�<$tH��[]A\A]A^��H���H�|$�/����W��H�|$L��L���N��H�}@H�t$�?��H�PH�$H��u
��H��H�B��H��u�H�$H����O��H�$H���p���DH�0H�|$�C?��H�$�څ�~f�H�I0��u�H�$H�Q0H�P0H�Q0H��tH�B(H�H(L��H��H�A0�M��H�$H��u�H��[]A\A]A^�DH�?tH�t�n@��fDH�7H�W�UH��SH��H��(H�|$���tH�EH��([]��H�D$H��H�x@����u�H�T$H�5��D$H�z@H�����L��H�T$�D$H�UH��([]��H��tE1�����fD1��DH���H���I��H��H��t
���������1��DH��H=���H��u�9f�H��H�FH��u�H�F(H��tH��H�F(H��u����1��ff.�f�H����AUI��ATUH��SH��H��(L�d$H9Ot0H�@L�d$H��t"L��H��H�L$��N��H�D$H��taH�H�L$H�{ E1�L��L�����H�D$H��t=H�p(H��u�Jf�H��H�F(H��u�H�t$H��H���D�H��([]A\A]�f�H��(1�[]A\A]�1��DH����H�O�A���AWI��AVAUI��ATUH�oPSH��H�w(M��A��H��tL�L�fM��tE��tI�<$H��tH�t$A��H�t$@H�^ H����H��H��u�L��M��u�I�E(I�E I�E8I�E0A�EI�EH��[]A\A]A^A_�ff.�f�ATI��UH��S1��/L��H��tL��H��H��H���H��[]A\ÐH���L��H��tH�H���f.�H�G�ff.��G���D��f��G�ff.�����H�w�f�ATI��UH�-�SH���H�{@H���J��H��u�L��H���<A��H���t[]A\�DH��H�SPH�C`H�<���:��H�C`H��u�H�{P��:��H�{p��:��H��[]A\�:��ff.��1��I@��f�ATUH��SH��H��H�G8H��tfH�xt_H�F(H��t=H�xt6H����J��H�$H��t%I��H�0H���m:��L��H���H��H�$H��u�H��1��_@��H�ĠH��[]A\�H��1��F@���DoM�Do�o{�os D�DoU�ok0�oc@�o[PDS�Do] �oS`�oKpH���D[ �Doe0�o��Dc0�Dom@Dk@�DouPDsP�Do}`D{`�DoMpDKp�Do��D��H���H���DE}u H���H��m0e@]PU`Mp��H�Ġ[]A\�f.��USH��H���W;WtH�O�B�S�CH��[]Hc�H���ҍ,��wN�H�?��Hc��B���S�SH�sH��Hc��D���k�SH��H�C�ff.�f��H��t
�W1������ff.�AVA��AUI��ATE��U��� S�A����L��H�øN�D��Mc�L���tA��L��1�H���@��L�+H�CH��D�s�C�k[]A\A]A^�fD�G��SH���WM����u�C���C�CH�HC[�fD1�[�@ATUSH���W;Wt!H�o�B�S�C[Hc�H�D]A\�fD��D�$��wDN�H�?A��Hc��@���S�SH�sH��H��Hc��C���C�{D��1�)�����Hc�Hc�H��?��H�k�SD�c�x���DH�t)UH��SH��H��H�H��t$�OG��H�(H���[]�H�W��fDH�;��
�6��H�CH���G��H�SH�{H��DAVAUI��ATUH��S�V�G�wD�g�9�.H�OA��I�uD��H�Ic�H�<�B��[A�EE]A\A]A^Í6���N�9�~
��9��E��H�}D��Mc�L���l?��L��1�H���>���UH�uH��A��Hc��YB���]A�UH��H�E�E�i���AVAUI��ATA�UH��� S�?��D�uL��H�ËED����DOeA��Hc���>��D�s�U�C�UH��H�CH�uL�+D�cHc���A���}�S1��C)��{����Hc�Hc�H{��=��H��[]A\A]A^�f�UH��SH�� H���z>��H�SH�(H�P�S�P�S�P�S�PH��[]�fDUH��SH����A��H��H��H����H��H��H��[]�f.�AWAVAUI��ATUSH���F����H�^I��H������A��1�L�<��fDA��H��H��H��tH�;H��t�:��H�L9�u�H�uL��1��=��I�\$H�D$I���DE��tE�uI��H��H��t)H�3H��t!H��H�4$�9��H�4$L��I��H���l@��M���A9l$�A�EH�D$H��[]A\A]A^A_�fD�L���#=���H�D$��f�H���ff.���H��t
�W1������ff.�ATI��U���(S��<����L��H�øN�tm��Hc��<��L�#H�CH��H�C�k�C []A\�ff.�f�AUI��ATA�UH���(SH���`<��L��H�ËE��DOeC�4d��Hc��A<��H�CHcUH�CH�uH��L�+H�RD�cH���&?���E�C�oE$C$�oM4K4�oUDSD�o]T[T�oedcd�omtkt�o�����o�����o�����o�����o�����o�����o�����o�����o���o���E �C H��H��[]A\A]��G�G ÐH����AUATUSH���.�W ���������t1���N��	ʉ�������V	����t�V	Ձ�������H�WI��H��HcH$Hc��H�IH�@H��L�$�L9�v�4@H��I9�r'9ku�H�;L���1����u�H�CH��[]A\A]�@H��1�[]A\A]�1��������߉��|���AWAVAUI��ATUH��SH��(D�6H�T$D��E��t7D���v����	������O�E	����t�E	�����A�փ��A�UA�u ��D��T$������I�}I�D�HcH$Hc��H�|$H�IH�@H��L�<�L9�v�@H��I9��vD9su�H�;H���0����u�H�t$I�}�D$E1�H���<��1�D�L$H�C�I9�s7�o�M��t�oI���AL$�H�CI�D$�H��I9�rFD9su�H�;H��D�L$�T$�0���T$D�L$��u�A�mM��LD�H��I9�s�f.�M����HcD$H�t$H�@H��H9�v �oI��H��AD$�H�C�I�D$�H9�w�E�UI�U1�A�A�E E���fDA�u H������I�|�D����D�����u
	�D�O$A�E A��H��E9�u��Qf.�	�C�T�$A�E �D$L��C�������I�}H��H���";��H�t$I�}H��;��D�sH�CH��([]A\A]A^A_Å�t��1�����%����A������AWI��AVAUATUH��SH��(D�6H�T$D��E��t7D���v����	�������E	����t�E	�����A�փ��A�WA�w ��D��T$������I�I��HcH$Hc��H�|$H�IH�@H��L�$�L9�v�pDH��I9��^D9su�H�;H���-��A����u�H�D$H��1�E1�H�C�I9�s4�N�M��t�oI���AM�H�CI�E�H��I9�r@D9su�H�;H��D�L$�T$�-���T$D�L$��u�A�oM��LD�H��I9�s�@M����Lct$H�t$K�vH��H9�v&��oI��H��AE�H�C�I�E�H9�w�A�A�G 1�A�����A�W H�D$H������I�4�D����D�����u
	�D�N$A�G A��H�D$D9�u��3@	�C�T�$A�G �D$L��C������H�t$H�(H�pD�pH��([]A\A]A^A_Å�t��O�����%����A������AW�AVAUATUSH��8D�&D�����G ��E��t9A���VD��	�A��A�������FA	�A����t�FA	�A��������H�WH�t$I��H��HcH$Hc��H�T$I��H�IH�@H��H��H9�v�bf.�H��H9��KD9cu�H�t$H�;H�L$�+��H�L$����u�IcGH�T$L�kI��H�@A��L��E�OL9�s*�~f��AoMI��H��K�I�E�H�C�L9�rQE9eu�H�t$I�}L�T$(H�L$ D�L$�+��D�L$H�L$ ��L�T$(u�A��I��E�OL9�s�f.�L�t$M9�v%fD�AoEH��I��C�I�E�H�C�M9�w�A�G 1�A�E���Bf.�A�w I������I�<�D�������u		�o$A�G ��I��A9�u�H��8[]A\A]A^A_��%����A���?���f�AWI��AVAUI��ATI��USH���.���t1���V��	Љ����� �F	����t�F	Ł����߃�A�T$ ���D$��������I�D$I��HcJ$Hc��H�IH�RH��L�4�L9�v�SH��I9�rG9ku�H�;L���w)����u�H�sI�<$L��E1�H��B�)<��H�CH��[]A\A]A^A_�fDA�L$Lct$C����L����I�<$L��H���'5��I�<$L��H��5���kH�CH��[]A\A]A^A_�f�A�L$Lct$	�C�L�$A�D$ ��%���߉����f�AWI��AVAUI��ATUSH���.H�T$���t1���V��	Љ�������F	����t�F	Ł����߃��A�W ��D�������I�GI��HcJ$Hc��H�IH�RH��L�$�L9�v�VfDH��I9�rG9ku�H�;L���(����u�H�sI�?E1�H��AH�L$�:��H�CH��[]A\A]A^A_�DA�OC����L���<�H�t$L�(H�p�hH��[]A\A]A^A_�fDA�O	�C�L�$A�G ��%���߉������AVAUI��ATI��UH��S������I�4�����A�T$ ���u
	Љ~$A�D$ A�]��t.A�U��	Ӊ����t[A�U	����tDA�]	Á�����L���p�I�<$L��I����2��I�<$H��I���2��A�^I�F[]A\A]A^�%���߉����������ff.�f�AUATUH��H��SH���+��H��pI��H�X�8��I��A�D$��~"1�H�SH�3L���H���b%��A9l$�H��L��[]A\A]�ff.�f�ATD�GI��UH��S�����H�4��D����W ���u		�D�F$�G �]��t+�U��	Ӊ����t6�U	����t �]	Á������?�H�(L�`�X[]A\�%���߉������������ff.��AUI��ATI��UH���(SH���C.��L��H��L� H�EH��H�C�E�C�E�C�E�C��8��D�KH�s�C E��~ME1�1�A���D�C H������H�<�D�����D��u	D	��W$�C ��H��D9�u�H��H��[]A\A]�f�AWAVI��AUI��ATUSH��8H�BH�<$H�D$(�H�t$��/���ƒ�HQ�L�:�D$$M��u$���ƒ�IVA�L�:M���<E�'A�U D�����rA���/v�I�VH�BI�F���E��t<A��A�wD��	�A��A�����/A�WA	�A����tA�WA	�A��������H�L$(M�\�IcC$H��H�@H������H��A9����L�M��t�D9cu�L��L��L�\$L�D$�#��L�\$��u�L�D$H�S��H��H�|$H�$L���L�\$��u��D$$����H�\$(1�f�A9m~GH�3H��t2H�SH�|$��H��H�$�Ѕ�u؉D$$�D$$H��8[]A\A]A^A_Ð��H��A9m����@�D$$�f�H�QH�BH�A�K�����������A������ff.�H���H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$�H�L$�D$H�D$H�D$ �D$0H�D$��)��H����fD���g�G���[AWAVAUATUSH��H��X�t$LHc�H�|$@H�?H����*��LcsH�SI��A�F�I�L�L��H��H�P�H��H9�u�H�D$@J�4�H�8�*��H�D$I����I�^�L��H��H��H��L�fDL�mL�eI�uI�<$�s!����~L�mL�eH��H9�u�I����L�T$A�f�K�L��L��1�H�$M9���L�T$8L��M��I��H��fDI�+I9�I��MF�I9���I9���M��M��I��I��M����I��H�k�M9�tqM9��
J�,�N�4�H�L$0H��L�\$(H�uI�>L�D$ L�T$L�L$H�T$� ��H�T$L�L$��L�T$L�D$ L�\$(H�L$0�L��I��H�k�M9�u�M��M��M9���L��H��H�4�L��fDH�<�H�<�H��L9�u�L)�I�,L<$H��I9������L�T$8M��I��L)�H��I9�v�I��I��H��I9�w�L�$M9���L��M��I�����@��L��M��I9�s%L��H��H�4�L��H�<�H�<�H��H9�u�L)�H��I�,L<$I9��g����c���f�M�������M���1��a����L�T$H�D$@H�|$�D$Hc@L�wH��I��L9���H�$L�l$�fDM��H9,$��I��I�]M�&I�nD�{E9|$u�H�I�<$H��H�D$������u�H9,$�6I�FD;xt-�'f�H�uH94$�H�ED;x�H��H�t$H�8�����t�L�}�H����@H�D$@D�@H�x�D$��tWIc�H��H�@H��H��f.�H�8t�oH��B�H�pH�r�H��H9�w�H)�H��i�UUUUA�H�D$@D�@L�\$@A�C E��~L1�1�A��
fDA�S H������M��D����A�����u
	�A�q$A�C ��H��D9�u�H��X[]A\A]A^A_��I��|$Lt>H�F�H�@H�CL���	DL�eH��I�$L9�v��D$�A���fDL��E1��H�]H�{H���O"��M�dL9�v�H�D$@L��L��H�8��%��I��H���f.��, H�Xf�H�EH��H��H�p�P��H�E�H�x��!��H�L9�v��I�EL�`M�&�>����L�|$�[���fDH�D$@H�x���M��H������AUATUSH��D�oD��FuH��[]A\A]����I��H����/��E��tfA�D$ �s 1ɿ���s&A����Dꉔ�������uA�T�$D�T�$H��H�� u�	�C H����H��[]A\A]�b ��f��AoD$$C$�AoL$4K4�AoT$DSD�Ao\$T[T�Aod$dcd�Aol$tkt�Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$��Ao�$�A�D$ �C ���SH��H��H��H��E1�1�H�� H�<$H��H�=,�H�D$H�D$���H�D$H��tH�t$H��t
�,H���'��H�� [�f.�@1��ff.�f���ff.�f��7���f.������f��)7�ff.������fD��������������7�f����ff.�H���H�7��H��H��f�H��ff.��H�7���f�H���H����H)7�ff.���H��DH������H�H���ff.�@H���H�7��H��H��f�SH��H�1�H��t��'����uH�C[�fD��[ÐATI��UH��H��SH���!��f�H�@H�EL�`H�EH�1�[]A\ÐH�FH�1��fDAUATI��H���UH��SH���%���H��I���S!��f�H��H�@I�$M��t8L�hI�4$H��H�&���H�
��!H�.H�F���H��1�[]A\A]�f��/��H�CH���3N[]A\A]��H��H�?H�����,��ff.�UH��SH��H��H�~H����-��H��tH�E1�H��[]�fD�/��H�C�:N��H�OH��uH�61��SH��H��H��H���&��H�C[�AUI��ATUH��SH��H��H�pH��t�?"���C0��uP1�H�{pH��L�k@��H�kPE1�H�CH�C`H�CX�C0H��t��.��H��D��[]A\A]��H���,��A�ą�t�H�{pH��u���ff.�H�GP�f.��AVH��A�ֺAUI��H��ATA�̹�UL��SH�� H�|$�{'���Å���A����H�|$I��D��D��L���N'���Å���L�l$H��$��0DH�T$H�|$1�H�����A�ą�����~��H�|$L��H��H�D$ � ���Å�t�=~t�H�|$�!��H�|$�!��H�Ġ ��[]A\A]A^�f�H�T$H�|$ �p����Å�t=xuD�d$,L��D����*������f.�H�|$�&!���@H�|$D���!��H�|$�	!���y���@H�|$� ��H�|$�Å�t�� ���V������ �����I���@I�ȉѺ�Q����I�ȉѺ�A����H��H��C����t�z���H���AVI��H��AUI��ATUSH���'��H��tbH�߾ I�����L��H��I�H��H�� ��H�
��!H�����H�EI�L�`H�8H��H�@����[1�]A\A]A^������[]�A\A]A^�H��H�?H�C����(��ff.�AVAUATI��UH��S��H�����I�|$�I��� ��I�D$H���sH�E`�PA�����vyH��ށ���H�Q�H���Bށ�����I�<$�EH�}A��tD�m�E�H���vQH�p����M��H�Eh�xE�H����[]A\A]A^ÐH�
-D�,��ڀ�A��E��k���@H�M �M �I�t$I��L������H��L9�wkL��H)�H��I�D$H�p�����I�$L����H���#��H�E`��t=xtI�D$H�H�Q��	����EI�<$��!�I�D$�����x�/t�H��$H9�s��/H���v���f�A�]�H�E`�E��D����ff.�H��H��3��1�H���ff.��SH�������H�߉������t����[�ff.�AUI��ATU��SH��H���	��A�ă�t!A���DD�H��D��[]A\A]�fDL�����������H��tnA�|�/H�P�t�+A�|�/H�J���H��H��u�H��L���%��H�����H�‰Ѓ�x+Hc�A�|
/t ��H�H)�L��
H���</t�…�y�ҸL��H��H�Hc��X%���8�K���H�ډ�H������A�ą��&���H�ډ�L�����A������f�H9��u����Z���f�H��������t�^���H����H��tH�FH�1�Ð�(N�f.�UH��SH��H�H��tH�hH��1�[]�f�H��� H��H�T$�K��H�T$f�@H�H�H�hH��1�[]��H�FH�1��fD�G�ff.��1���������€���E‰€ʀ��E‰ƒ�@��E‰€���@E‰ƒ� @��@E‰ƒ�@�� E‰ƒ�@��E‰€��� E‰ƒ�@��E‰ƒ�@��E‰ƒ���E��@1��������€���E‰€�@�ǀE‰€�@��@E‰€�@��E‰ƒ�@@�� E‰ƒ� @��E‰ƒ�@��E‰€� ��E‰ƒ�@��E‰ƒ�@��E‰ƒ���E���H�����H��H��H��H�H���|!��f.�f�AWAVAUI��ATA��UH��SH��H����uqH�H����1�@�p�‹{���;�����tZH�sL�uL���v��I�FL�u�C0A�F0��uS�S4A�V4�S8A�V8H��[]A\A]A^A_�fD�~�H��A�ǃ��������H��[]A\A]A^A_�fDI�~p��I�~@�L��S4�P4�S8�P8A���!�SH�8H��H�
��!�����PH���!���H��1�[]A\A]A^A_���I���fD�xL���K��H�xH��H�@pI��H��1�H)���x���H�L�uL��M�.E�~H�s�P���S0I�FH�EI�ƉP0���'����S4�P4�S8�P8�E���fDH�{p����I�~pL��1���"��L�uA�V0L����������H�sPL�����H�SPI�F@H�EH�PP�����1��d���f������fDH���H�|$H�|$���H���AUATI��UH�պxSH��H��H������S0I�$H�(��u:H�sH��tM�,$H���=��I�E�Ct{�C����H��1�[]A\A]��H�sPH��I������H�SP�{`I�E@I�$H�s@H�PPH�x@t{H�SX���H�{pt�I�$H��1�H�xp�!��H�{p����i���L�-��!H�;H��L���3��I�4$�FuH�
��!L��H�������O���f�H�
��!���H�SH�7���DAT�I��UH��SH��H��H�����H��t"H��L���/��H�EH��1�[]A\�D����$���"D�H��[]A\�f.�H���g����t�N���H����H��:/t�5N�f�UH��H��SH��H�5�$H�����H�EH�H��f.�H�H���x�/t�H��1�[]�f.�AWAVAUATUSL��H��HH�|$(H�t$�L$H���
�:/I�����D$��H�|$H�����.��H�D$L���!��H�L$H�t�$H����H�����A�>/H����H�D$�8/t�5N�D$�aL�|$H�t$H��L�����L��M���~B�|;�/��M��/L�|$ �~�Ȩ�t�4N�D$�H�D$H����D$�A�t$H�|$8H��������nH�D$8H�D$���I��A�>/t��/A�H�D$ A����tqL��M����/u��@L���EL�m��t</u�M��M)�t:��.��I��u��u*I��u����<J�<;L��I��L��M��g���E����B�;L�|$L9|$ s�D$�+H�D$(H�1�H��H[]A\A]A^A_�H�D$H��t6�8/��H������L�5k+�D$�������H�D$ E1��
���H�D$H�=+H�D$���@A�UM�u���A�~.�0���I����M��ue�D$����J�<;����H��A����t1���H�
s!���4@�4D9�r�1�A�}��M�|L9|$ ����EL�|$ ����I����vB�|;�/../t�I��t^B�|;�/u��TL�t$L��H��L��������u!C�|>�/�����B�;�������</�����H��H�7N[]A\A]A^A_À;/t[E1�L9|$ �N����D$�a�������;����_���H�D$I��H�D$ ���f�;..�S����{/�I��������D$u�H�D$ ���4N����f�H�Ѻ:�#
��H�Ѻ:����1���AWAVI��H��AUI��ATA��USH���D$�T$���H��H�D$H����E��H��1��@H�xH�|$H��tD������H��u�H�D$L��L�l$���-��L�d$I��DL��L��H������H��H��t�;t�L��1��[��H���fDM�>H��1�[]A\A]A^A_�@1��@�~���AWAVAUA��ATUH��SH���VH�L$H�<$����H�FD�z�1�L�pO�$��	DI��H�8�
��H�L��M9�u�H��t|H�|$J�t;�
��I��H�$L� �E��~C1�f�H�EL�<�L����	��I��H��tH��tE�,$I��L��L��L��M��j��H��9]�A�$H��1�[]A\A]A^A_�H�$H�H��1�[]A\A]A^A_�@��ATUH��SH���Gp�s�~����C�E%�=`�)���=�t*�=�t�=�t=��EЋEH�uH�SH�{HI��S㥛� �C�E �CH�E0H�C8H�EH�C(H�E�C0H�EH�C ����H�MPH�uXH�{PH��H��?I��H��H)�HSH����H�M`H�uhH�{XH��H��?I��H��H)�HSP���H�MpH��H��?I��H�E@�KH��	H��H�C@H)�HSX[]A\��= �+����=@����������	���ff.�AUATA��UH��SH��H���B0��tH���K����uI��s�L�������t����H�Ę[]A\A]�H�L��H��H�EH�CH�E`�����E�x��D!�E�H�Ę[]A\A]�AUATA��UH��SH��H���B0��tH�������uI��s�L�������t�{���H�Ę[]A\A]�H�L��H��H�EH�CH�E`����E�x��D!�E�H�Ę[]A\A]�SH�����	��H�߉��;��1҃��t��[����[����DAVAUI��ATI���UH��S��H����I��L��t&�����t]�����H�Đ[]A\A]A^�fD�
����u�M�,$L��L��I�l$`����A�D$�x��!�E�H�Đ[]A\A]A^�f�M�,$L��L���I�l$`������1���u	��ATA��UH��SH��ӺpH�ĀH�������u6�t$��tA��tE������t$��tA��t ���t$H�����H��[]A\�D�����t$��@��"�t$�ff.��ATH�Ѻ@UH��SH��H��H��H�|$ �*��A�ą�tH�ĠD��[]A\�@H�t$hH��H��4�ׂ�CH��H��H��H��?H��H)�H��H�$Hi�@BH)�H��H��H��?H�t$H��H��H)�H�T$Hi�@BH)�H�\$�G
������{������D� H�Ġ[]D��A\��AVI��AUI���ATI��US��H���vH��H���3
����t����H�Đ[]A\A]A^��I�D$M�uH��L��I�E`����غx���E�A�E��!�E�H�Đ[]A\A]A^�f.�AU��f�AT��I��USH��()$)D$��t	�f�$1ۃ�I���Ã�A�|$L���1�����Ņ�y������t݃��t
H��(1�[]A\A]�
�D�H��([]A\A]�f.�AT1��f�UI��SH�� H�D$H���D$f�D$f�$D$A�|$H��1�����Å�y�Y������tڃ��t1�H�� []A\�f�AWI��AVI��AUI��ATU1�SH��H��L�d$�L��L��L��H�\$�u��H�T$I�H)�HՅ�uH��u�M��tI�.H��[]A\A]A^A_��AWI��AVI��AUI��ATU1�SH��H��L�d$�L��L��L��H�\$���H�T$I�H)�HՅ�uH��u�M��tI�.H��[]A\A]A^A_��AWAVI��AUATI��UH��SH��(H�L$H�D$H���BH��H��E1�H�DLxH��H9�u�L�l$H��L��L��L�����H�|$H��tH�T$H���uwH�t$L9�tmM����H����I�VH9���I�N1��fDH��tKH��H�IH�Q�H9���H��H)�I9�u�H�t$H����H�\$H��tL�;H��([]A\A]A^A_ÐH�D$�I9�vЄ�t�H��H��I��I�VI�6L��H��H��I�����I9�v���t��H�t$H)�1�H7H�����������@E1�����1��H���^���I�VL��1���L��H��L�H�W�AVAUI��ATI��UH��SH����tWH�����	���D$�����H�t$L���L�����M�4$H��L�����I�F��tO1�H��[]A\A]A^��H���H	���D$���t=H�t$L��GL���J���I�$H��L�����H�C�|$1��������u����H��[]A\A]A^�fD���|$���1�������t�I�$H�
s�!H�|�!H�8H�����I�$�`����1��;���f.�DATUS�o0H����uJD�c�C����D�������u#�Cu=H�{pH��t
�7����E��[]A\�D�c�?�������#������H�{�?����ff.�f�USH��H���o�G�������6����uH�{pH��tH��[]���fD�k�����H��[]��AW��AV��AUATUSH��(��������A�
����p��t��@����@��@D�Ѓ�D��@����A��M�ĉӀ���I��I��E�����E�����E��
A��D��%�=�������$�������‰�L��1��_
�����=D��4�!���xL�����L��H�xH��H��H�@pH��1�H)���x���H�I�UL��Z�jL�"H�T$���H�T$I�mH�B1������E4�E0��H�E@H�����H�EH�E(�E8H�EhH�EHH�EX�E`E����E1�H��(D��[]A\A]A^A_�D1��r���f���_���fD������fD������1��m���������������D���D�0�fD�L������H�E@I�mH�EP�E����H�D$H�Ep����H�
	�!H��!H��H�}�6����*����1�H�|$L�‰L$����L$������A������f�1�����������E�����!����?�!����f�A�
���DH��H���!H�?��
��ff.�H��������t����H����H�������t�~����H�����F�1���AVI���xAUI��ATA��UH��H��S���H�xH��H�@pH��H��1�H)���x���H�H�]H������CH�C4A�L�+�CD���H�C(�����C1�A�����C0u[1�]A\A]A^�@L������H�}H�C@H�GP�Gt�[L��]H��pA\1�A]A^�
��ff.�@��~�D��ff.���H��H�у�H�t$�D$���`���H���ff.���H��H�у�H�t$�D$���0���H���ff.���H��H�у�H�t$�D$������H���ff.�H��1����fDH��1�����fDH��1����fDUSH���G�Ł�uu�tH����[]�DH���1���������ta��{���1�������tH�KH�;H��H�
��!H���!���H����[]���H����[]�f.���(H��[��]ËW���u	��%u
�f�SH���1���m������t@���{���1��T������t'�c����H�;H��H�
;�!H�D�!���1�[��s�[��ff.�@H��ff.��H���7��1҃��t��H���f��+�H�����f�AWAVAUI��ATI��UH��SH��H��H�|$�������3L��xE1�I��)����xH�xH��H�@pH��H��L��H)���x���H�H�UL��L�*I������D$L�j(L�r0D�j8�B�B H�B�BH�Bp���H�xH��H�@pH��H��L��H)���x���H�H�L�r0�D$L�"L�j(L�%�!�BH�E�B H�-�!L��H�BH�8H���BH�BpH������H�L��H��H�8H������H��1�[]A\A]A^A_����H��[]A\A]A^A_�f.�U�SH��� tH����[]�fDH��H�w(�G41�H��x?��tۋ1Ҿ1��	�{�����1�����tP�C4H����[]Ã�t��1Ҿ1����{����1�����t�C4�f���D���(�U���@H��t@��t+��tSH��H�81�����H�;1�[����D��H�?1����fDH�81����ff.�� �t�@H�G(H�1��fDAUI��H��ATI��xU��SH��H�����H�xH��H�@pH��H��1�H)���x���H�I�uH�H�FH�����H�F4A�$H�H�F(�����F��t4�F0H�
��!H��H�FpH���!���H��1�[]A\A]�f��F1��F0H�FpH��[]A\A]�ff.�f�H��1����fDH���H����ATA��H��UH��SH��H���'�����uD��H��H�߉D$�Q����D$H��[]A\�@ATA��H��L��UH��SH��H�������uD��H��H�߉D$�����D$H��[]A\ÐSH�������H�߉�����1҃��t��[���[����DSH�wH��1�H�H�H)��w��uH�SH�[�f.������[�f�@��1��~8�fDUH��SH��H�����H��H��H��[1�H��]��f�1��`t��ATUSH�_HH��tEI��1�fDI�t$@H��A�|$H)�H���H��~+I�\$HH�H9�w�Il$h1�I�D$H[]A\�f�I�\$HH9�sH���u�����t���f�H���u�����ÐAWAVI��AUI��ATI��USH���`L�:�A�F8�����A�$I�l$A�F8����I���I�FH�1fDH)�H�I9�H��IF�H��H��}���I�FHH�I�FHI)�t=I�^XI�v@H9�w�I�VPA�~�c�����t_���trHc�I�FHI�v@I�^XI^h럐L)�1�H��I�mE�H��[]A\A]A^A_�DL��M���X���I�E1���A�FL)�~�fD�s�L)�Hc������u�I�FHA�F`I�FX����I�E1��w���AWAVAUE1�ATUH��SH��H�H����D�o0H��I��E�����G8������H�EH�P�H�U�G8����H����I��A�����I�Nj����H�U�{L������H���t�L�uH��t��L�H�EH��D��[]A\A]A^A_�H�pH��t����H��H��L������H�{pA��H��t��s��뿐H�E�fDE1��������t#L�uA���f��CA�~�|���fDH�{(uL�uA��`���1��H�����t�DA���u��{H�UL���!�H���t�������D�(����f�H��H��H��H�T$H��H�D$���H���ff.�AWAVAUATI��UH��SH��H��D�o0H�E��t�C�3�I�Ƌ����H��}L�����H���t�H�H��D��[]A\A]A^A_�@H�pA��H��t�G�E`�����E1�E��A��A �D�t$�?H�}H�Hf�Ic�H)�L��H9�HG�H}@H��A)�I����H�}HH�H�}HE����E����H�]PD�t$E1�H9�u�H���w���H�]PH�}HLc�M��A�����tkH�A������@H�EhH��H+uXHuHH9�t�}1���H�EhH������E1�H�EXH�EH�E`�����H�}(t�1�1�H������z���H��}L���w�H��������A���t��Q���H�H��H��ϐH�}pH���e�������[����d�Lc(M�����b���fDH��(H��@�|$H�T$H��H�t$H�D$���H��(�@AVI��AUI��ATI��US�W0H����teH�pH��t�W�H�������Ņ����C`����H�ChH��H+sXHsHH9���H�{pH�CXH�CHH��t	����@�{D��L����H��xI�1�[��]A\A]A^�DI��l�[�(��]A\A]A^��H�{pH��t��z���[��]A\A]A^��H�{pH��t��Z������{1����H�ChH����F�����H�{p�(H�CXH�CHH��t�������S����6���fDUSH���o0��t)H��H�pH��t��H������H�{p��H��t����H����[]ÐUSH��H��H�pH��t���C0��tH������Ņ�u�{�����Ņ�uH�{pH��t�x���H����[]���3��(��ff.�@USH��H��H�pH��t�i�C0��tH�������Ņ�u�{���Ņ�uH�{pH��t����H����[]������(��ff.�@AWAVAUATUSH����~m�B0Hc�H��I��L�l7���upH��L�|$L9�r�fD�H��<
t'I9��L��H��H��H�D$��A�ą�t��L9�v	fDE1�H��D��[]A\A]A^A_�H�zpH��t�j��}`��M9��
L��L�|$�3DL��H��H��H�D$�A���A�ą�u>�H��<
t0L9�tZH�EHH;EXsȃ}8�u�H�U@H�HH��H�MH��C�<
u�E1�H�}pH���A�������L9��A����9���f�H�}pE1�H��u������@A�E����fDH���P���A�ą�u�E`H�EHH�EX�
���H�}pH�������+�������A����H�}pH��t�L��E1��Z���f�UH��SH��H��H�T$PH�L$XL�D$`L�L$h��t=)D$p)�$�)�$�)�$�)�$�)�$�)�$�)�$�� ��H�D$8H��t|H�D$ H H��H�L$H�D$(H��$H�=��H�l$0H�l$ H�D$H��H�D$@�D$�D$0H�D$�P��Å�xH���B�H�|$8��H����[]û������DUH��SH��H���`t^H�WXH��H+ChH�H9�wH��xH�CHH��1�[]�f��{1�H���3�H���tEH�CX1�H�CHH�khH��[]��{�����u�H�CX1��C`H�CH�@�3��H��[]�f.�AUI��ATA��USH��H���o0�G��t\H�pH��t�N�A����A��t~�E��tdH�{pH�ChH+CXHCHI�EH��t���H�Ĉ��[]A\A]�fD��I�u�B�I�EH���u����(H�Ĉ[��]A\A]ÐI�uH��������H��H�ھ���Ņ��r���I�uH��Ht$8�e������Z���fDI�uH��HsHHshH+sX�@������5���f�USH��H���G0H�t$��t8H�pH��t�=��C`��tU��uH�CHH�CXH�{pH��t����{H�t$�&������H�T$1�H���>���H����[]�H�CHH��t�H�ShH�L$H�H9�}H)�H��H)�H9иHC�H�CHH���e���H�{pH�CX���C`H�CHH��t�N�����u��b���D���(H��[��]�SH��1�H��H�T�H��1�H���2�1�H�|$H��H�������tH��1�[�@H�t$�!�����u�H�|$�������H����[�DAWH��AVAUI��ATUH��H�5�SH��H��XH�D$L�d$H�\$0H��L��H�t$0L�sH�D$H���H�D$ H���H�D$8H���H�D$@����u"L�|$M��tL����H��H=���H��L9�tH�3H��L���n���t�H��L9�u�L�5R�H�\$H��L��L�{�����uH��L9�t9L�3H��L�������t�L��H����I�EH��X1�[]A\A]A^A_��H��H�=�L�5��Z�����u�H��L���6��tBH��X�.N[]A\A]A^A_�fDH��L��������� ���DL�t$�o���fDH�|$H������t���f.�USH��H��H���H�{��H��t	��t��H����[]ÐH��[]��DAVA��AUI��H��ATI��UH��S���H��D��L��H�(H�xH������Ņ�u2H�CH�;H�@�t1H�CH�
��!H�[���H���#�I�][��]A\A]A^�@H�CH��1�H�����uH�;�fDH�{[]A\A]A^�/�ff.�@H�?H��tH�������)N�f�UH��SH��H�H��t�	���uH�}�
��Å�tH�}H��t��H����[]�ff.�f�UH��SH��H�H��t���Å�uH�}�Z�Å�tH�}H��t�f�H����[]�ff.�f�AUATI��USH��H��H�H��tH��B���Ņ�u"I�|$H���*��Ņ�tI�|$H��t��H����[]A\A]���{��I�|$H��I������Ņ�u�I�t��[��L��H)øHH��f.�USH��H��H����H�{��H��t	��t��H����[]ÐH��[]�u�DH�H�H�FH�GH�FH�G1���H��H�?H�3����>�ff.�H����H����H�����H����H��f.�f�1��ff.�f����f.�H�G�`0f��GH�(�@�SH��H�(�{t�CL��u#[�e�D����u)�CLH�{(��t�@H��(�����uH�{(��D1�[�ff.��H��PL�@��u1��@UH��SH��H��H�x(H��(���H�3H��H�
��!H�[�����H��1�[]�ff.�f�UH��SH��H�����H��H�����L��H�}(H��H��4�ׂ�CH�H��H��H��H��?H��H)�H�$Hi�@BH)�Hi��H�\$�����ntB��t=�u�ELH�}(��uJ�����E1�H��[]�DH�(�����tރ�u¸w���H�(���DH��(���H�}(말H���HH�����ff.�@H��1������=wD�H���H���������@AUATUSH��H��8H����H��H�����H�;H��H��H�D$���H�t$H��H������UE1���t"��@D��H��i���A��U��u�L�l$��� 1�H���L���������I�ċ�������L��1�����H��H��t�L�����H�k8H�;L���5�H�
V�!H�;H��H�CH�ݦ!�x��1�H��8[]A\A]��3��L�l$� H��4�ׂ�CI��H��L��L��H��?H��H���H��H)�Hi�@BI)�1����K������$u��D$�
@A�$��u����L��1������H��H��t��%����� ���u1��DH��1�1�1�1��O�1�H����AUI��ATI��UH��SH��H�7H��te�PL���8��H��L��L� H����L�1�H�{@H�C�H������uH�S@�R�CH�S I�]H��[]A\A]�f�H�nH��u�1���H������H���S��H��t	�����uH�{(�0�?���u[�f�[�ff.�f�AT1��UH��H�=j�SH���"����
E1�A�����01�A�����H�E(H�����D��L�d$����ELL���E������������L�������u}�L��������uj�L�������uWH�}(L���;���uEH�E(L���@(�E�������H�
��!H�#�!H��H�}����DH�����L������H����[]A\�D����H����[]A\�fDH�E(�{��D�����H����[]A\�fDH���H���H����[]A\�ff.�f�H��H�8�s����x1�H����H������H���GH�8����x1�H��ÐH�������H�����������D�H���DSH���f.�����8uH�{8�}���x��C1�[�fD[�DUH��SH��H����H���&��H��4�ׂ�CH�4H��H��H��H��H��?H��H)�H�$Hi�@BH)�Hi��H�t$�D������u$H�}8H���8����x��EH��1�[]�@��n�wD�H��[]�fD�����w=�D�H��[]�ff.�@SH���f.�����8uH�{8�=����x��C1�[�fD[�R���f�SH����H��p�T$�L$�9���{ �H��f�D$1�1����1҅�x
H��p��[�f��+���H��p[��ÐUH�-ȯ!SH��H���G������8u&�{ �H���6���x�H��1�[]�f�H��[]���DUH�-n�!SH��H���fD����8u.�{ �H�������x��CH��1�[]�f.�H��[]���DUH�-�!SH��H���fD�C���8u.�{ �H���~���x��CH��1�[]�f.�H��[]���DATUSH��H��H����H��I��H��4�ׂ�CH��H��H�-��!H��?H��H)�H�$Hi�@BH)�Hi��H�t$��������u,�{ L��H���A����x��CH��1�[]A\����wD�H��[]A\�@����w=�D�H��[]A\�DU���SH��1�H���F���C ���tn1��ǹ1������x5�CH�;H��1�H�
��!H�(�!����H����[]�f.�����{ �(���u!�C ����H����[]Ð����(H��[��]�1�1�1�1����C ������f.�H�t1H���Ё�@� �������Dʉ������x1�H���fD1��DH�������H�t1H���Ё�@� �������Dʉ�����x1�H���fD1��DH������SH���G�
����8u�{ ��y���x�1�[Ð[�z���f.�USH��H���tQH�{@1�H��t����ŋCH��u�{ ���t�����u���t2f�H�{H��t�b��H����[]�f��[����Ņ�t�������(���SH���f.�����8u&�{ �����x��C1�[�f.�[���f.�SH���f.�����8u&�{ ��i���x��C1�[�f.�[�Z���f.�USH��H�k@H��H�?H�������L�H��H�C�FH������Ņ�u@H�C@H�;H��H�
ל!H�h�!�@�CH�C�C ����H����[]�fDH���X���H����[]��H�5���\��H�H��FH�CH��������z���ff.�USH��H�k@H��H�?H��tk���L�H��DH�C�FH�������Ņ�u:H�C@H�{�@�CH�C�C �c��H�
�!H�;H��H��!���H����[]ÐH�5�����H�H��FH�CH��������f�UH�-X�!SH��H���G�������8u&�{ 1�H���d����x�H��1�[]��H��[]�u���DUSH��H���tAH�{@1�H��t����ŋCH��u�{ ���t������u��t"H����[]�f��K����Ņ�t����+���(���UH�-��!SH��H���fD����8u.�{ 1�H�������x��CH��1�[]��H��[]���DUH�-H�!SH��H���fD����8u.�{ 1�H���<����x��CH��1�[]��H��[]�E�DH��H���!H�?�~��ff.������!��f��!�̧!��f�ɧ!���!f�
��!H���!H���!�n�!�|�!H�A�!H�>�!�$�!�2�!�f�AVI��AUI���PATI��H��U��S����f�@ @0@@@L�0H�@(H�@8�@ �����@H����H�$�H��Hc�H��@H�Q�!H�CH���L��H��Ѕ�uI�$[]A\A]A^�DH���!H�CH����@H��!H�CH�^����@H�Q�!H�CH�6��@H��!H�CH�����놸��DH�H��H��H��H�@H�@8��f.�H�G�`f�H�G�`f�UH��SH��H���f��'H��'�_��H���7��=�u8H��~ H��'�H���:��H�����=�u�wH��[]����u��EH��[]�fDH�G�` f�H�G�`(f�H�G�@H��H�GH�@P��H��XH���!H���D$ ����H�D$(H�D$8H�D$@�D$HH�D$�=��H��X��H�GH�E�!H9�tH���!H9�t1�ÐH�G�ff.�H�G�`@f�H��ff.���oF �oN0OH��t	H�F�@H�1��ff.�1�����f�M����AVI��AUI��ATM��U��S��H��H�H���JH�@(H�@8�@ ����H�@@�@H���mH�
T�Hc�H��H�i�!H�XM��tA�����4�P 1�H�p H�x@L���/����u&��t"H�
��!I�uL��D$H�>�!�����D$H��[]A\A]A^��H���!H�XM��t�I�VH����H�P(�DH�1�!H�XM���s���I�VH����H�P8�]���fDH��!H�XM���4����>����H�a�!H�XM������������PL���{��f�@@ @0@@I�EL� �����"N�f.�����������ff.��I��1ɺ����H������ATI��UH���8SH��H������1�H�(H�xH�������u%H�
1�!H�;H�����H�މD$�S��I�$�D$H��[]A\�f�H��H�����ATL�fUSH�_H��H��xkH������L��H��H��4�ׂ�CH�(H��H��H��H��?H��H)�H�$Hi�@BH)�H��Hi��H�L$����w��nD�H��[]A\�DL��H���%��H��[]A\�ff.��H���W���H�������H��H�?H��������ff.�H��f.�f�H���W���AUI��H��ATA��0UH��SH���p��f�A��H��@@ H�(tUL�d$L���(���Ņ�tH����[]A\A]�D�L�������Ņ�u]H�{L������L��������DH�x1������Ņ�u�H�;H�
M�!H��H�;����v��I�]H����[]A\A]�DL������q���H������H��H�������t����D�H���ff.�@UH�oSH��H��~iH������H��H��H��4�ׂ�CH�H��H��H��H��?H��H)�H�$Hi�@BH)�Hi��H�\$�c����t��n�wD�H��[]�DH���`����t��wD�H��[]�f.�H���G���H��H�?H�������ff.�H��f.�f�H������ATI��UH���@SH��H���e��1�H�(H�xH���d����u%H�
��!H�;H�����H�މD$����I�$�D$H��[]A\�f�H�������H��H���������D�H���H���g���H��H���������D�H���H���W���H��H�?H�����~��ff.�H��f.�f�SH�G H��H��tH�H�S H�x�PH�C H��u�H�[H��tH������H�[H��u�[�ff.�f�H����AVAUATUH��SH��f�H�;1�1�����=vt�CH�[H��u�H��E1�A��f.���t[H�[H��t'�C�P���u�H�;��J��H�[��ED�H��u�E��ugH���
�H�[H��t?�{u�H�;�	�����f�H�;�	���떐H�}1�1�1��a��H�mH��t�E��u�H�mH��u�[]A\A]A^ÿ�A������H��E1��	H�[H��t7�{u�H�;1�1�����=vtA�CH�[H��u�f�I����-�-���A���#���L��M�����@E����f�AWAVAUATUH��SH��L�oL�'H�O�W I�uI)�K�$H��������I�]H�{H�S H)�H9���H�SH�H�H�PI�EH�CH�I�E L�+M�EH)�I�]H�CH%�H�YXH-H��A�EA�PH9�v;L���H��zH9�w�L�I�EH�XH�BI�EL�(H�YXI�UL�jH�{L�����H�C LcH�]L�eH��H�EH��1�[]A\A]A^A_�fDL��'I���I9���H�q0I�����M�������I��I��I9���H�L9���H�~H��tH�t$�0��H�t$H�H�~J�\�(J�D�(H����L9���L���H9���H��H�H��H��t�L�L�H9�w	M���<�C��H�VHFH9�HG�H�FH�����|����� ��� ���H�q0H�A�A� L9��4���H�F(H��t^H�~H��tH�t$�[��H�t$H�F(H�~H��t/�HH��L9�r��f��KH��L9�s}H��H�H��u�H��t����L������H��H��t@I�D�pL�x H�{(H�H�{�} tH�E(I�EL�m(�E I�u�����H�������[]A\A]A^A_�@H��H�H��B����H��H��H���H��tH��H�<�t�H����L�����H�N(H���ff.�@S�H��H����&��H��tH�@H�1�[�f��[�f�ATI��UH���SH�_(�@H�H�譹��H�;H��u�H��H9�u�[L��]A\鐹��H�w�ff.�H�G�ff.�H�w �ff.�H�G �ff.�UH��SH��H��H�H��tK�v��H�EH���H�}H��H�H+EH�uH�EH9�wH��t=H��[]����H�u��f�H�EH���H��H�H+EH�uH�EH9�r�H��[]�fDH��'1�H���H9�wH�� � HC��f.�AUATUH��'SH���H��H9��H�����I�����I��I��I9��YH�I��L9���H�H��t
�l��I�EI�}K�\�(K�T�(H���yL9���L���H9���H��H�H��H��t�H�3H�2H9�r	H����C��I�UIEH9�HG�I�EH���������H�A�� I��L9��L���H�G(H��tMH�H��t���I�E(I�}H��t(�HH��L9�r��f��KH��L9�seH��H�H��u�H��t�@��H���H��H��H��t0H�D�`H�h H�C(H�H�CH��H��[]A\A]��H��1�H��[]A\A]�H��H�H��B�����H��H��H���	@H��tH��H�<�t�I�E�����L�����I�M(H����ATUH��SH�H��H��t���H�ML�ME1�H�E��H9���L�#I��L��M��tD�SL�H�rM��u�H����H�|�L�G(L�H9�vM��HD�H�_(H9�sr1�L��M��u�H�}H�MH�EH��t����M��tf.�I�$L���ĵ��I��H��u�[]A\��H��wJH�t�H�~(H�;H�^(H��uH9�vH��H��H)��@����H�}(H�;H�](H9�s�1��l���f�H�u(H��H)�H�3H�](����f�AWAVAUI��ATL�fUI��SH��L9���H�oXH�U H�EH��H)�L9���H�]H�CH�K H)�L9���H�sH�H�H�qI�H�M�CL�cH+UH��H�KH���H�H��H�+H�}H��H�]I�]X�U�OH9�v6H��f.�H�	�qH9�w�H�;H�UH�ZH�QH�UH�*H�MH�iH��[]A\A]A^A_��I�L�eH��[]A\A]A^A_�f.�I�E@H��t���H��1�[]A\A]A^A_��M��$'I���M9�w�I����_M�������I��I��I9�w�I�u0H�L9���H�~H��tH�t$�߾��H�t$H�H�~J�\�(J�D�(H���XL9���L���f�H9���H��H�H��H��t�L�L�H9�r	M�����C��H�VHFH9�HG�H�FH��t�0��H�C(H�H�U H�C�+����H�F(H��tWH�~H��tH�t$�$���H�t$H�F(H�~H��t(�HH��L9�r�f��KH��L9�sNH��H�H��u�H��t���L�����H��H���l���I�D�xL�p �\���@A�A� ���H��H�H��B����H��H��H���f.�H��tH��H�<�t�H����L������H�N(H����SH���7���H��H��tH��1�H���R���H��H��[�f.�AUATUH��SH��H�GpH��t!f.�H�H�UpH�x�PH�EpH��u�H�}H�EpH��t&���H�}H��u�H�E H��t�H�H�U H�x�PH�E H��u�H�}8H��t�[�H�EH��t<H�@0H�xH��t耼��H�UH�EH�H��tH�PH�EH�@0H�xH��t�&��H�]`L�m0H�CL��H��k���H9��ZI�}H��t�$���M�MM�UE1�I�U�H9���L�#I��L��M��tH�CL�H�HM��u�H����I�t�H�~(H�;L9�vH��LD�H�^(H9��~1�L��M��u�I�}M�MI�UH��t�k���f�I�$L���D���I��M��u�L��褻��H9��{H��[]A\A]�H��wJI�L�H�q(H�3H�Y(L9�vH��uI��H��H)��0����I�u(H�3I�](H9�s�1��`���f�I�M(H��H)�H�I�](���f�H��L��[]A\A]鎿��fD1�L��莸�����f��1�!��t
���$�!��t��H��H�=�!谿��H���!H��!H���DAUATUSH��H��H�GpH��t!f.�H�H�SpH�x�PH�CpH��u�H�{H�CpH��t6��;���H�{H��u�H�C H��t f�H�H�S H�x�PH�C H��u�H�{8H�C H�C(H��t��L�c`H�ChH�C8H�CHL�cXI�D$M;$$��L�k0I�D$I�}H�I�,$H��t�~���M�MM�U1�I�U�fDH9���H�]H��L��M��tF�EL�EH�HM��u�H����I�t�H�~(H�}L9�vH��LD�H�n(H9�sx1�L��M��u�I�}M�MI�UH��t����H��t�H�+H��蝭��H��H��u�M�$$M�d$H��[]A\A]ÐH��wJI�L�H�q(H�uH�i(L9�vH��uI��H��H)��8���I�u(H�uI�m(H9�s�1��f����I�M(H��H)�H�MI�m(�����AWAVI��AUI��ATI��UH��SH��H�H��HD-��!H��u	H��tL�m@M����I�$H����I�|$H���2���I�\$0I�$I�T$0I�|$H����H������	H9���H��H�H��H��t�H�3H�2H9�r	H���;�C��I�T$ID$H9�HG�I�D$H�����9���@L�e0I�$H���O���I�D$(H��tMI�|$H��t�6���I�D$(I�|$H��t%�P��t���S����H��H�H��u�H��t����� �ι��H��H���J�@H�� H�C H���L�{(H�H�[H���H�CL�cXH���H���L�khH�C0H�CHH�CPHǃ�H�C`H�CpH�CxH�k(H���}H�E0H�xH��tP�C���H�E0H�xH�EH�C8H��tH�S8H�PL�}H��H�k@H��t����M�>H��1�[]A\A]A^A_�@H�EH�C8H��u�L�}H��H�k@��DH�C8H�C@�fDI�|$0I�T$0H����H���������fDM��t�A��H���[]A\A]A^A_��H��H�H��B�����H��H��H���	@H��tH��H�<�t�I�$���I�L$(H��븹�t���H���1��e���ff.���=q�!AVAUATUS�"NH���I��I��I��H��H����H�EH����H�}H����諴��H�]0H�EH�U0H�}H���<H������
�H9���H��H�H��H��t�H�3H�2H9�r	H�����C��H�UHEH9�HG�H�EH���������H�E(H��tGH�}H��t�	���H�E(H�}H��t"�P��t��S���EH��H�H��u�H��t���� 覶��H��H�����@H�� H�C H���H�S(H�H�[H���H�CH�kXH���H���L�shH�C0H�CHH�CPHǃ�H�C`H�CpH�CxH�C(H�C8H�C@M��tuI�U1ۉ�[]A\A]A^�@������H��H��t1H�@����@H�}0H�U0H����H���=������M��t��A���@H�U �f�H��H�H��B�B����H��H��H���	@H��tH��H�<�t�H�E����H�M(H��빹���H���1�����ff.�f�鋲��ff.�AVAUI��ATI��UH��SH��0H�GXH�|$H��H�xH�D$H�@ �D$ H�<$H�D$(L�@�L�D$H9��>L��H��H�=�H��詭������1H�$H�PH�$�H�T$H�$H�\$(L�bL)�H��H��L�H�BH����M�u0I�~H��t�b���M�M�V1�I�V�H9��7H�+H��L��M��tG�CL�H�HM��u�H���PI�4�H�~(H�;H��uL9�LG�H�^(H9��1�L��M��u�I�~M�I�VH��t譽��H��t�H�]H��脥��H��H��u�|$ ��I�uXH�|$H�V H+V�GH�FH��H���H�GH��H�8H��H�7L�H�~I�}X�VA�@H9�v2L���H��HH9�w�L�H�H�zH�PH�VH�2H�H�pH��0L��[]A\A]A^�f�H��wZI��H�q(H�3H����L9���H�Y(I��H��H)����f.�I�v(H�3I�^(H9�s�1����f�I�N(H��H)�H�I�^(�X���f�H�������������I�E@H��t��Ѐ|$ uH��0E1�[L��]A\A]A^�DM�e0H�l$H�T$(I�|$H�UH��t	�/���H�UI�<$M�D$1�I�L$�$f�H9�sSH�]H��H����H��H��EH�pM��u�H��wcM��M�Q(L�UM��uH9�HG�I�i(H9�s51��fDH��wRI�4�L�N(L�MM����H9���H�n(H��H��H)��@M�L$(L�MI�l$(H9�s�1��b���fDI�t$(H�uI�l$(��I�<$I�|$I�L$H��t����H�������H�+H���ݢ��H��H��u����H�Y(�!���H�n(�q���ff.�H���H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$�H�T$�D$H�D$H�D$ �D$0H�D$�	���H���ÐH�~@�ff.�H�G@�ff.�H��ff.��H�G0�ff.�H��u�f�H9�tH�6H��u�1�ø�f.�H�wP�ff.��Q�!�B�H�!1���t
�f�H��(H�=�!�`�����t��!H��(�H�
�!1�1�H�=�!詤����uuH�=�!H�5;��2���H�=�!薩����u�H��!1�H�|$�_�����u�H�t$H�=�!�D$���H�5�!H�=�!�S����D$�u���f.�H�=q!�D$谰���q!�D$H�R!�@���DH�BHH��tSH�����H��H���d���H�1�[�DH�1��ff.�H��tKAUI��ATI��UH��SH��H��H�G(H��t4H�0H�w(H�S H�hL�hL�`H�H�C H��[]A\A]���� �.�����ff.��AUI��ATI��UH��SH��H��H�yHH��tyH�����L��袷��H��t=H�{HL��H�����L��跡��H��tH��H��L��H���a���H��1�[]A\A]�@L��H�����H�{HL��H�����H���o����DH��耬��H��H�CH�s���@ATI��UH��SH��H��H�yHH��t6L��H������'���H��tH��H��L��H���Ѧ��H��1�[]A\�fDH��H�t$����H�t$H��H�EH�DH��t;H�G(ATI��UH��SH��H��t-H�H�O(H�SpH�hL�`H�H�Cp[]A\�fD��� 讧����ff.��H��t{H�G H�O H��u�,@H��H�H��tH9pu�H9Pu�L�L�H�O(H�H�G(H�GpH�OpH��u�1�H��H�H��t%H9pu�H9Pu�H�H�H�W(H�H�G(���ff.�@H��t+H�G H��u
� H�H��tH9pu�H9Pu�H�H���ff.�@UH��SH��H��菣��H��H��H��[]��H�=)|!�$��@1��ff.�f�ATI��U��SH���z���H�S8L� �hH�PH�C8[]A\��[���ff.����ff.�����ff.��[���ff.��K���ff.��{���ff.��k���f.��H�ͷ��SH����Ҫ��H��t�8uH��[����H��H��[���f.�f�SH��H���ě��H��tH�1�[���[�f�H����ҟ��H��������H���W���1�H���UH��SH��H����N~d��������/9
�����
~l��
H�5���t��H�5�H��HE�DH��H��襞��H��H��[]�������;u�H��H��H���}���H��H��[]��09
)���袢��H��H��H���T�����f���9N��r��,N�~�P��&N�$��H�5_���)N�[�����H�5���'N�B�����(NH�5��H�6�HE��%���D��x��^��r����H�5����u�����H�5<���s������tH�5K�H�ļHE����H�5Ѷ��*N�������+NH�5�H���HE����H�5q���"N�m�����H�5����$N�T�����%NH�5��H�H�HE��7������3N���H�5���/N����YH�5¶��-N�������.NH�5��H��HE�����f���!NH�5��H�ĻHE����H�5Ѷ��0N�������1NH�5�H���HE����H�58���6N�m����H�5���4N�T�����5NH�5�H�H�HE��7����H�5	���v������wH�5(�H��HE�����H�5����;N���H�5^����H�5y���<N������qH�5��H���HE��������t��H�5����~�����iH�5����|�v�����}H�5	�H�j�HE��Y���f�H�5a���7N�=�����8NH�5p�H�1�HE�� ���H�5����
������H�5�H��HE���H�5ɸ�������3H�5<�����������H�5S�H���HE����H�5������������H�5d�H���HE��x����H��H�5������H��H��[]��H�5���D���@H�5I��4���@H�5a��$���@H�5i�����H�5M�����H�5�����H�5u���D�GD�W@AT�G8U�o<SD��D)�D�L����D��L�_()�~@Hcу�Hc���H�I��H�I�T�M�d�fDH�2H�H��H��H�p�H�JL9�u�~C�K�Hc�Hc���H�I��H�I�T�I�\�f�H�2H�H��H��H�p�H�JH9�u�A)�A��~?A�J�Ic�Ic���H�I��H�I�T�M�T�@H�2H�H��H��H�p�H�JI9�u�[]D�O<D�G@A\�AVAUATA��USH�oH��t-H�G(H��I��I��H�8�ǚ��H�{M��L��H��H�5ո1���[D��]A\A]A^�AUI���HATI��L��UH��S��H���N���H��e!H�
��L��I�$H�PH��e!L�(H��@ H�PI�$�X$��H�H0Hc�H��H������H�S�H��H������H�I��I�$L�@(I�D��@H�H8�@@H��1�[]A\A]�@AWAVAUATUSH���G ����H�_0�;��L�KL�O0D�#I��I��H�L$H��L�$E��D�gA��:��D��L���К��L�$H�L$H���n�x:�H�H�E0�8u�EE�}H��1�[]A\A]A^A_��G D�GD;G$}GL�O(Ic�I��H�_0�;-u3�{L�K�O���L�O0�{-tH�CL��I���6���@A��D�GH� �H�G0�G��~H��[]A\A]A^A_�@�{u�EH�]H��t,A�>:t&H�E(H�8蓘��H�}D��H�5��H��1���D�}E�}H���|[]A\A]A^A_Ð�U�{�Bu|�E9E$��H���H�E0A�>:��H�]H��t�H�E(H�8����H�}D��H�5��H��1���D�}�f�A��-�>���A�E-H���~[]A\A]A^A_�DL�	H�5��EH�u0�r���f�H�u(H�H��H��B��E�e�}����AWAVAUI��ATI��USH��H��(D�O E����H����G�H�G0�G D�C8�{$E��t;9�}4L�C(Hc�I���8-t$�BH���I��H���9-t	�‰C9��S@9��?L�s(Hc�M�<�A�?-�*���SA�oI�W@��-�@��u<�|H�5�H��(H��[]A\A]A^A_����f.�H�W0�*@���=�F��t#9�tmH�F��H��9�tX�xH�ƅ�u�L�kA�|M��t)H�C(H�8�[���H�{A��H�
ȴH��H�5״1�A��H��(D��[]A\A]A^A_�@A�,$�NH�B��tY�zuHcC;C$���HH�S(�KH��I�EH�4�H�C0�3�A�u5H��������C<A�~�C�f�I�EH�C0H��E1�����f���D�FI�GH��H�D$E��tf�H�uD�D$H��tDH��H�4$莕��H�4$H�|$H��H�D$������uH�D$L�L$D�D$J����t_<=t[H��D�EE��u��|L���E���L�kA�}M������H�C(H�8���H�{A��H�
F�H��H�5y�1�A�����E�$�u��t!�:=tUHcC;C$}8�PI�ƉSI�E���I�E�:=����}L��H�5������}L��H�5Ҳ���H�D$J�DI�E����W���f.��H��m!H��tXUSH��H;z u�MfDH9x tH��H�BH��u�H��1�[]�DH�ZH�hH���������P1�H�+H��[]�1��H��H�?m!��ff.�f�AVI��L��AUI���0ATI��UH��SL���|��������H�L�pL�hH�h M��tA�T$�P(H��l!H��H��H�
�^!H��l!H�PH����[]A\A]A^�ȕ���H��l!H���5���H�p H9�t�H�@H����H9x u�H��UH����SH��H��H�8袓��H�[l!H��t#H�r H9�u�BH�p H9�tH��H�BH��u�H��[]�@H�ZH�h�������PH�+H��[]�H��H��k!��鍥���H��k!H��tI�H�x9u"H����H�@H�p �P1�H���fDH�@H��tH�xL�@9t�L��H��u�;N�DH�GH��tgU���SH��H���8H�t$�[���H�S9t#��uGH�s �������SH��[]�f.�H�CH�s 1��T$�SH��[]�@�����u�H�CH�s �¿�S�ff.�U��SH��H�=�j!H��t@H�_���͗��H��H��u�H��[]�f.�@SH��H��H���@���fo$1�H��[�AVL�5�AUI��ATA�����UH��SDA���u�]��{������umH��L��D���֕��H���t�H��xMt!I�H)�u�D��1�臔����[]A\A]A^�@D���p���H��t71�L��1�菝��A�ă��u���������	����D���?�����[]A\A]A^�A������f.�f���i!�B��i!1���t�f.�H��(觓���2���������u71�1�H�|$1��������D$u)H�|$H�5ٮ蠌��H�|$�����D$H��(�D�"N��鋠��ff.��-1i!t�fD�ۖ��ff.�����f.��H�H�GH��f.�H�\����H��xH9VrHV1�H��fD�f.�DH�GH�W H�OH�JH�WH�O H�J H�GH�G H9�t1��@SH��H�wH��Ǚ��H�C������t�f���[��f�1�[�ff.��AWAVAUATU�SH��H����H�����~����n0����M��E��H��I���(L��I��H�T$�E���f�D��L����L�L$�@H�@ D�CI�E�EЉЃ�A��E�1��,���H���tVI�UH�
SY!H�BI�EH����L�8H�@L�`I�EH�@ H�8H���^���H����[]A\A]A^A_�D�	��I�E�C����(��ff.�@ATI�Ժ(UH��L��SH���ƈ��H�
�X!L��H�EH�X H�SL� H�EH�PH�SH�EH�B H�"���H�CH�u�ŏ��[1�]A\�ff.�H��H�?H���ޜ��f.�@H����L�OI��A�dH���W���cv\��M�C����f���H0A��A�)�f�ʉ�k�g��f��
)��A0��A�C�)ʃ�0M�XA�@.A�L9�u�A�@H���f�M�؀�	v���I��������f���H0���A�)��DH������1�H���f.�AWAVAUATI��USH��hH�T$H�$���m��
t 裇���a1�H��h[]A\A]A^A_�@�����1�1�E1���L�D$A��f�A�Df����A�<�f���������u�¾H��H��u΃�������tA9�}A����A�������N�L�t$01�L���efDL�h�:��u��uA����A����@Hcþ.L����L�L��H�b�L)�H)�1��G���H�L���9�����u�I��������?���D9����uH����A��D��H��������$���f�H��D��H����������f.�H�$H�t$L�����H��h[]A\A]A^A_�B�\=�:H�����b���H�P���u?�O�|$$������L��I�|$L��L)�H�P.�;���H���7���L���j���L�H�PD���u
�:H��H���L)�H9$r5H�\$L��H��腆��H��h[]A\A]A^A_�fD����]����L���f��k����1�����f.�@AWI��AVAUATE1�U1�SH�ߨH��(H�t$L�l$�D$@I��E�w�E��tJD��H���׊��H��tbA�MH)؍��H=�wuA�E��u�A��A��cI��E�w��E��u�A��~J�D$H�T$�H��(�[]A\A]A^A_�A��.��@��tA��tA�E1�I���^���fDH��(1�[]A\A]A^A_��AWI��AVAUATI��USH��8��t'��
tB�=����a�����H��8[]A\A]A^A_�L��H������H��8[]A\A]A^A_�fDD�f�)D$ A��:��H�D$ L�d$1�E1�H�$H�-[�H�D$H�D$E��I��E����D��H���u���H��H��t5H)��	Á���v1�H��8[]A\A]A^A_�@A�E�$�D��H�=Φ�)���H���gA��:�E��uAH�<$u�H�D$L�d$H�$�f.�D�FI��A��:�$���1��{���fDH�L$H�T$0H�AH9��\���f��L�d$E1�f�1�H�D$�\���fDE��t#H�L$H�T$0H�AH9�����f��H�D$f�H�$H��tWL�t$L�d$I)�I��J�D0�M���&f.�H���I��A�L$H�H��H;$u�foL$ �A����H�L$0H9L$t�1����A��.�����H�D$H�XH�D$0H9�����H�t$H�|$���H�\$���P���1��^���H�5R��@���f.�U1�SH��H��H�|$�+�����uXH�|$H��tIH����H�H��tHH�PH��t�f�:
u�H�KHH�sPH3JH3rH	�u�H�x�{���H�|$���/���H����[]�fD1���ff.��AUATUH��SH��H��(H�FD�HM���LA��t&��A�)A��
tH��([]A\A]��E1�E1�#H��L�D$A������L�D$A��.D��D$H�E0H�L$D���oD$�oHL$(�oP T$8�oX0\$H�o`@d$X�ohPl$h�op`t$x�oxpI�@0A��$��o�$��oH�$��oP �$��oX0�$��o`@�$��ohP�$��op`�{�$��oxp�$�/�������~1�H��([]A\A]�fDA��tr��A��
�����H�B0E1�#A���oA��)D$H����H������D$ �{H�L$D��)A�谁�����u��c����W���@�BD�D$H��t,�AD�D$�C��1�H�L$A����l������t�1��<����D$��fD�D$ �x���H��(H�F�T$�@��t��
tG��H��(�D�F��H�L$A�1��������1����u��~���H��(�f.�1��D$��!H�L$�‹~A��)�D$����I��H��H��H���#����f.�I��H��H��H���$���f.�@��H���!����ff.�@@��H���"���ff.�@SH��H��H�G�@��t��
tG��H��[�@�H�NDA�1�� ������1����u��}���H��[�f�H�����H�L$�{A��D$��)�f.�ATI��UH��S�G@H���� t�If��;}�����u|�{H�UL�����H���t�H�{(~H;ErrH�E[1�]A\����߉G@1�1�H��辅����t�5���|�����u�{H�UL�����H���t��D��t#[H�E]A\�fD�K@ ��H�{(����ATI��UH��S�G@H����t�Yf��[|��������{H�UL��豅��H���t�H�{(~H;Er~H��H�E[�]A\%~�f.����G@1��H���˄����t�2D��{�����u�{H�UL���E���H���t��D��t#[H�E]A\�fD�K@�v���@H�{(����AWH�F@I��AVA��AUI��ATM��USH��H��H�D$���[{��H�ŋ��u9�{E�M D��L��L�D$I�$�F���H���t�I�$H��1�[]A\A]A^A_���uNH�{(~G1�1�H���Ѓ����t�5f.��E��uЋ{E�M D��L��L�D$I�$�݂��H���t��I�$H��[]A\A]A^A_�ff.�AWI��H�O AVA��AUL�o@ATM��USH��H���G �H�|$H�$�@�cz���H�Ń�uY�{L�$M��D��I�$L�����H���t�H�L$�y ��I�$1�H��u�{�~D�H����[]A\A]A^A_���u[H�{(~T�H��1�赂���…�t�=D�U��uЋ{L�$M��D��I�$L���W���H���t�H�L$�y �w����
I�$�H�$H�D$�PB�p@H��f�����&{��H�$1�I�$H���O����>���ff.�AVI��AUI��ATA��UH��S�����R�H�F1�H��H�Tf�HH��H9�u�E@�� t�Jf.��x�����u|�}D��L���fz��H���t�H�}(~H9�wt[]I�1�A\A]A^�fD��߉E@1�1�H���~�����t�5��x�����u�}D��L���z��H���t��fD��t#[]I�A\A]A^��M@ ��H�}(����1��%���f�AWAVI��AUATI��UL��SH��H��(H�I�8���H�D$vI����M��H��U!LD�E1�A�F���9�C@L�l$�� tT��߉C@1�H��L�l$1�荀��������H�EH��(��[]A\A]A^A_�f.��w������pA�t$�{L��H�M�<���A�����t�E�Ic�H;E�lA�V����I�vH�L$H��D�D$蒋��D|$D�D$��Mc���1ҾH��D�D$�y���D�D$L�}1�E���J�����v����>���f���v�������A�t$�{L��H�M茅��A�����t��K������H�������������A�VI�6H�L$H���؊������H�t$A�NLc����{���I�>��H��H�WH�Lf�H��H9�u�H�H9��I���H�u1ҾH��臄�����e�����t{�L$L�}1ҾH���d����L$�@���Mc�1ҾH��L�}D�D$�=���D�D$��E��~YH�{(�����K@ ���f.�Mc��{����H�{(������u���H�E�su������@�~���L�}�Uu����L$�G���f.�AVAUATI��UH��SH���zL�j0���^H��H��H��L���x��H���a�{
��B�D%��{
tH��1�[]A\A]A^��H�C0�%��=��u�H��I���[y���{XL��I���m���L9�u�H���1H����������!� ��t����€�D�H�qHDΉ�@�H��H)�J�D)L9���J�D-H���%H�P�����������E���A�6@�p���4�����A�L�f�L��"���H�C0��������P��������x����I�����L�mL���tx��L��H��H�P��������H��H��L����u��H)�A�|�����H���[]A\A]A^�H�4$H��	H�p���H��I�|6�H�|2�H)��I)փ���s�����1҉փ�I�<6H�<09�r��X���A�6�p��A�L��L��B���UH��SH��H��H�;Hcv(�h{��Hcs(H��H�EH��H��[]�_u��ff.�@�wf�w@f��t��f�Wf��f�GB��t1��
t��tG�fDH�GH�G(.H�G0H�H�G �f�H�GD�G(H�G0H�H�G �f�H�GB�G(lH�G0H�nlH�G �f�AWf�AVAUATI��USL��H��h)D$0L�t$0H�|$f�L$)D$@)D$P�T$4�D$8���6�D$0 H����L�D$(L��1�L��L��L�D$�+���L�D$E1ɉʼn�����L��L��L��L��d$0�����Ņ���L�t$(M����E1��DM�v(M����A�F���u�H����y��H�xH��I��Hǀ�H��1�H)�������H�I�]I�}@A�VI�v�|���T$A�vL����r��M����I�GI�EM�o8M�v(M��M���r���H�|$(����M��uEfD�.N�8�H����H�L$(L��1�L�������Ņ�����������09
)��H��h��[]A\A]A^A_��M��tL��H���|��I�EH�D$L�(�b������L���D$0!��t��L�D$(L��1�L��H��L�D$H�D$�v���L�L$L�D$���D���D��L���D$0�}t��H�L$(L��1�H���;������1���@��o���(���8�����@1������ff.��UH��SH��H����uX�s8H�R��u�K4��uH�U1�H��[]Ð�B ��{H�r@H�� ������xeH�SH�C4�BBf��f�B���uc�C<H�R ��t��B ��{H�r@H�� �r����xUH�S �C<�BBf��f�B�s�����o������i���H�S�Z����H�H���[]�D��n������1���H�S �"���AWI��AVAUI��ATI��UH��SH��8H�H��H�1�f�2L�D$�&s��M�t�M9��p胅��L��H��H��I9��S��DQu�I9��@I9�v	��:�jM��M)�A�?[I�IL�L$H�����]L��H�L$�\w��H��H����I9�H�L$L�L$��H�ʾ%L��L�L$�(w��L�L$H���0H�S�H9�tmI��H)�H�|$H�pM)�H�S�I��L�L$�n��L�L$I�EH�|$L��I�w�n��H�T$ �
H�EH��������1���tGH�EI�E1�fA�$H��8�[]A\A]A^A_�f�H�|$L���m��H�E1�H��8[]A\A]A^A_�fD�
1�L���)x���P�����w�fA�$H��81�[]A\A]A^A_��I9��z����
H�{1���w���P������[���fA�$L�s��`���I������AUD��M��ATUH��SH��H��H���tVH��@�Dž�@��@�ul��tg�;/��D��A����A��uZH��M��D��H��H��[]A\A]������uH��u���u�H��t�;/tp��H��[]A\A]�H���[]A\A]�M��D��
H��H���j�����t1����@�M��D��H��H���B����
���[���1�떐L����s��H��H�xH��H��Hǀ�H��1�H)�������H�H�UH�zBL�*�l�am��L�eH��L����v���H�nI�D$H�Ef�P@H�PB�@(lH�P0H�pH�E�P(�P$H��1�[]A\A]�ff.��H�H����AVI��AUI��ATI��U1�SH���p��[j��H�E8H��H�sH��tI9�tI;utxL���v��H�EH�sH��tI9�tI9utHL���u��H�E�S�sL�eH���l��H�[8H��tH��H��L��H��u���i��H��I��I�H�@H�E�I�H�sH�@H�EH��u��f�[1�]A\A]A^�D1��ff.�f�AVAUI��ATUH��S��H�� �l��I����E��
�������۸L�t$�u D�H��L��E1�H�}@E1��S�r����XZ����I�E���t'���1�)Á�09
H�� ��[]A\A]A^�fDA�$�����À�
��@H�E1�I�E��@D�EHE���]����}L���R����}P���E���H�E0���$H��L�t$���@L��D$�D�H��E1�E1�S�Jq��Y^���-����H�}L���$t��H�EI�E�7�����{h����À�
����ff.�ATUSH��0H����H��I��H�L$01�H�T$L�L$A�H���7v����uIH�D$H��t?�@I�<$H��f��fA�D$�s��I�D$H�D$�@fA�D$BH��0��[]A\�@H��0���[]A\�DH��0���[]A\�ff.�f�AUATUH��SH��H��D�g$D�n$E9�t3�C@�U@f��tef��u
f��
��1�H��[]A\A]��H�v0H�0Ic��p����u��{
�E��1҃�
u�EX9�u����f�1�f��
u�H�M0D�E��u��y��u��y��u�H�{0Ic�H�q�\p���������l����H�K01��1���U����Q���J����y���=���H�}0Ic�H�q�p��������� ����SX��
�L���1��H���ff.�f�U1�SH��H�o0H��t.HcW$��w%H��H��H�=���o���¸��t1��{
tH��[]�f.��M��u�U��u�}��u؋E9���������AW�AVAUATUSH��(����yH��I���:I��H��I���yk��H���pL���$��m��f�H��
@fv�I�$@M�4$I�^H���z������A�V���WA�
I�$M�����9
���
L�� H�t$HD��Hp��H�T$�:�2I�$H�QH���)H9�� f�AI�$H�� ��H�x�H�qH��H��L�D������H��I9�u�H����H��H��H�D�Hc���L��A�yDA��	�A��D��H��u��A�y���H��H���y�����7M�����0NH��([]A\A]A^A_�f.��;{��H�H���
H�����.t���DQu����]����A�F�������A�~��������@I�$H�PL���sx���¸1N���j���I�$�9�]���H�qH�A�P!H��H9�u�H��(1�[]A\A]A^A_��H���h��H������H�\$H��H��H�ރ��>1ɨt	�
���t�<
f�<H���t�
�A�FA�F�T$�҈T$�#�z���T$H��A�H��A��H�u�DV������H��H��DVt�H���H��DVu�<.t{���U���A����K���1��
�m��=��4���D��L��A��H����AFH��ANA�FH��A�N����k�����A�NI�$A�FA�H�q���f��H����A�����@��1҃�у�H�t
H�49�r�H�4H����1�H�q�;���1�1��f.��F��tHH�V0�
��u�r��u�z��u�?ty1��fD��
�t�D�?
t+�f.�1��?u�FD#G;G�����f�#O;Ou͋J#O;Ou‹J#O;Ou��B#G ;G�����f��B#G;G����Ã
�0NuH�W0�������t�ATUH��SH��H��H���k����uf��`��I�ċ��tH��[]A\�fD�
H�t$H���a��H�T$H���.N�:u�A�$��u,H�Q�H���w�KX�f.��CXH��1�[]A\�f��.N�f��
�0NueD�GXE��t\AUATI��UH��SH��H��H��t$�H���wh���{XH��I����n��H��t,M�,$1�H��t�SX�UH��[]A\A]������_�����f.�DAU�I��ATI��USH��f�D$H�l$H�\$�D$H�|$ @1�H��H���g����t�=wtj��u�|$�.NtH��[]A\A]�@�D$t�H�L$H�|$0�L��H�D$L�D$�l��=~t-��u�A�E��A�EH��1�[]A\A]�A�E1��f.�f�USH��H���G0�o��t
H�G�xt#�C�������f����t
�k�^���H��[]�H�x�^����DATE1�UH��SH��PH����f��f�H�߾�@@ @0@@H�EH��f��H�uH�xH��H��H�Hǀ�H��L��H)�������H�H�V��H�EH�PH�8H��If��H�uH�xH��H��H�Hǀ�H��L��H)�������H�H�V H�EH�P H��@<[]A\��U��SH��H���W1҉OH��4_��H�{ ��1��'_���C@H��[]�f�SH����e����u�C����[���;]��[����G�1���AWA��AVA��A��AUA��ATUSH��H����t[A�����L��D��EщT$�N����T$L�#D�����
t��A�D$L�#A�T$��yK�\���H��[]A\A]A^A_�fDL������D��D���
H�+��s��L�#�E�
A�D$��xQD��D���L�����H�H�
����H�p���H�@(����H�8H���@D�&c��H��1�[]A\A]A^A_�DD��D�����Ks��A�D$L�#A�T$���:����@H�����_��1҃��u��[�����H���ff.�@H��H�?H������o��ff.�UH��SH��H��@H���V��k�����t@�{H�]t1�f�{Bu�E4H��[]��H�H�E0H��1�[]Ð�;[���H��[]�f�H����h��1҃��u�[�����H���ff.�@AUI���ATI��UH��SH���A�|$H���D$ �H�r@H�� �h`������H��L����#���A�L$�t$@�I�}���I�UfoD$@�L$ H�B �ZH�B(�����B<H�R@@foL$PHPfoT$`P`fo\$pXpfo�$���fo�$���fo�$���fo�$��H ��I�D$�o�oHJ�oP R �oX0Z0�o`@b@�ohP�H@jP�op`r`�oxpzp�o�����o�����o�����o����I�]H�SH�*f����f��
��H�S f�����JBf��f�JA�L$4��t�C4A�D$At�K@A�T$8��uJHcP$H�x0H�5#7!�b����t2�CDH�
���H�;H��H����_��H���1�[]A\A]�fD�C8�����X���H���[]A\A]�H�JDH�J0I�]H�S �E����o "�ohj�op r �ox0z0�o`@b@�ohPf�x@jP�op`r`�oxpzp�o�����o�����o�����o����I�UH�RH�JBH�J0I�UH�R H�JBH�J0I�]�����H�S ���fDH�JHH�J0I�]H�S �m���AVL�v@AUI��ATI��USH�����W��H�ŋ����A�T$ A�}L���k���Ã��t�IcT$$I�|$0H�5t5!��`������I�Ef�xtLf�x@tTHcP$H�x0H�5F5!�`����tE1����u�!W������jD�H��[]A\A]A^��f�x@A�E4u�M�e�A�E8�fD��r���W���I�}(�L���1�1�L���_����u�A�}H�L$L�D$���D$�l`���Å����D$�������]����I�} �AoD$@A�E<A�D$ A�T$G@�AoL$PA�t$OP�AoT$`W`�Ao\$p_p�Ao�$����Ao�$����Ao�$����Ao�$��G ���W������E���ff.�@�G�1���ATUSH�ZHH�H��t,I��H���@H�H��tH�{H���_����u�H�CI�$[1�]A\�f�AVI��AUI���ATI��USH��H�?�]��H�;L��H���`��L�mH�EH�CHH�EH�kHM��tH�;L��L��L���[��[1�]A\A]A^�ff.���F�1���UH��SH��H��H���<����S�s�K H�}����H�H�EH�s�H�@(�����PH��t}H�@�P H�x@��_��H�EH�sH�H�QBf��f�QH��tgH�@ �P H�x@�_��H�EH�H �QBf��f�Q�@DH�
^���H�8H��H��� [��H��1�[]��H�H�sH�H4H��u��@<�UH��SH��H�H��t'H��@4H�H8�U�PH��1�[]�H��H���-���H�;1ɺ��	���H�H�@(�����ff.��H��ff.��USH���GD�Ł�uu�tH����[]�DH���1���U�����ta��{���1���U�����tH�KDH�;H��H�4�H�
�"!�xT��H����[]���H����[]�f.���R���(H��[��]ËWD���u	��%u
�f�SH���1���MU�����t@���{���1��4U�����t'�cD����H�
��H�;H��H����S��1�[���SR��[��f.�DS1Ҿ1�����T����߀��1���T��1҃��t��[Ð�R��[����DS1Ҿ1����T����߀���1��T��1҃��t��[Ð��Q��[����DSH��H��H�G(H��xGH��xH��tuH�s(1�H��[�f��G@u�H�t$�}�����uڃK@H�t$��fD�W@H��x(��t#�H�t$������u��S@H�t$������S@닋S@���S@�DS��H��H�� �҉T$���҉T$����:~H��@�<��������N������H�� [�������������@���uȋW@����9�te����b�m�����u��D$�S@���b��1��S@듁�����`���j����W@��	��9���1�H�� [Ã������<����W@���9�tڋH�L$A��	��R��������D$�S@���=��1��S@���H�L$A���)��Q�����tD�D$�S@���G��@1��S@���f��H�L$A����Q������2����EO���H�� [�D�W@��9������H�L$A��
��D$�D$�AQ�����t��S@�L$�Ѓ��t�Ѓ��C@1�� ���D�WB��9�������H�L$A�����P������Y����D$�S@������1��S@����@�1�H�L$A���P����������D$�S@���&��1��S@�(���fD�W@����9������H�L$A��	��JP�����������D$�S@���:�΀1��S@�(���D�W@����9�������H�L$A�����O������_����D$�S@������1��S@����D�W@����9��_����H�L$A����O����������D$�S@���z��1��S@�x���D�W@��
��9������H�L$A����BO�����������D$�S@�����1��S@� ���D�W@��tA��1��W@����@�H�L$A�����N������P���1��}������W@����D�H�L$A����N����������D$�S@������1��S@���fD�濉S@�p���D�����S@�]���f.�������������A���fD��S@�0���D��S@� ���D��S@����D���S@����D���S@��D�����S@����f.���S@����D��S@���DH�G(H�1��fD�G@!�9������1��ff.�S1�H���H���H�T$��R����x�T$1������H��1�[��K���H��[�ff.�ATI��USHc�H���n^����u"1�H��L����T��H��t&��[]A\��A�$�J��[�(��]A\�DA�$�$��@A��H�W��zt�DH���������@�D�D�Ɖ���[����1���y�LJ���H���D�����ƒ�@��E‰ƒ� ��E��H��H�GH�8�QR��1�H���f.�H���H�4R��1�H���ff.�f�AVI��AUI��ATI��USH��~"H���H��S㥛� H��H��H��H��H����A�VA�~HI�vP�Y���Ņ�xo�wt[1��"@�8�8���L��f�FA�ԅ�u=H��9�~5I�VPH�[H��H�pA�Ft˃~u�I�NH9Nu�I�~�"_���[]A\A]A^�@�I��[]�A\A]A^�AWI��AVAUATI��USH���H�$H��~"H���H��S㥛� H��H��H��H��H��I�GH��A�WH�p�8�X���Å��4�w��I�GE1�E1�1�H�D$�;fD�oIc�A��H��HOA�8�oHI� ���f�AI��D9�~SI�HK�DmA�OL�G��M��I�@L�HID���t��xu�I�WH9Pu�H�|$��]���f�E�4$E��tH�$1�H��tI�GHH�@H�A�W��uLI�GH��uH�p@H�H@H9�t2H�pHH�x0H�>H�p@H�x8H�~H�p8H�x@H�>H�pHH�p8H�H@H�HH��u,H����[]A\A]A^A_��sG��A�W�(��u��fDH�x�^����DH�x�Q��A�WI�GH���h����ATI��UH��SH��H�F�H�L$�D$H�D$�PH�GH�8�O�����ËE���uE������H�}HH�W H�G H9�t)I�L$H9J u�*f.�H9J tH�H9�u�uAH����[]A\�H�BH�
H�H�H�JH�HH�G@H�H�GHH�BH�GHH�H�WH��t�H��]��H����[]A\�f�H�EHH�x�P��H�}HH�W H�G H9�t�u���P����E�����h���f.�H��H�F�H�H�L$�D$H�D$�P��N��H����%�DH���F�HH�t$H�L$���D$H�F��P�N��1҃��t��H���D�{E���H�����f�ATI��UH��SH���F�WH�D$���D$H�GH����H�t$1�I�T$�8H�L$��R�N��A�ą�u?�U��u&H�EHE1��H�H H�H�H(H�KH�H(H�H�X(uIH��D��[]A\�D��D���UD� ��u�E��t�H�EH��H�H0H�H�H8H�KH�H8H�H�X8t�H�x��[��H��D��[]A\���uKH�H0H�P0H9�tVH�X0H�SH�H�
H�H�KH�J�Ao$H�\$C�AoL$K ����fDH�x�N��H�EH�f�H�}�0�bL��H��H�H�CH�EH�f�AWAVAUA��ATI��UH���S��H���Z�������PL��A���L��I��H�EHD�������E�>H�4[L��H��H����K��H��L��I�FL�uH��K��I�FE1�A��u(H�EHH�P H�P H�P(H�P0H�P0H�P8H�P@H�P@H�PHH��D��[]A\A]A^A_�fDH�EH�+C��D�0��fDI�~L��1��X��A�ƅ�uL�uH�S���f�D���8K��H�EH�ff.�ATI��UH���S���
Y����x&�EH��L��H�4vH���K��[H�EP1�]A\�fD�B��[]�A\�@�����ƒ�@��E‰ƒ� @��E‰ƒ�@�� E����G;GtHL�GH���o��H��H��IP�oNJI�H��H�V�R��V��f�Q�G1����f.�D�GE��t;L�_HL�N1�M�SI�R0M;Ju�f.�H�� L9J�t���AD9�u��fD��AVSA�X��_D9�si��)�H�L��H���Af�M����o��O�4M�4�H��L��oIJL9�tL�NM�SI��K��L9Iu��oL9�u�1�[A^ù1��v������f.��G;Gt8H�WP����L��H�V�RA��V��fA�PH�WXH�4ʉG1�����f.�D�OE��t6L�WXL�F1�I�I�RL;@u�H�2H��L9Ft���AD9�u����E�Y�D�_A9�vg��A)�I�H��I��I�L9At:SL�OP�ƃ�I�I��I��I9�tH��I�L9Au؃oI9�u�1�[�@�oI9�tH���1�ù1��DAWH��AVI��AUATUH��SH��H���H��~H��S㥛� H�H��H��H��H��I�NHA�v��H�9�O�������w��A�F����1�E1�M�fE1�I�VHD��H�
�|�f��t=H��HBA�Ft�xtg�oD��A��H��HJ�oHI���f�AA��E;nr�D�;E��tH��t^I�FH1�H�@H�EH����[]A\A]A^A_�f�I�NH9Hu�L���T������>���0���1��fDAUH��I��ATI��UH��SH��H��~H��S㥛� H�H��H��H��H���uH�}P���iN�������wti�E1ۅ�u$�o����L��f�FA�ԅ�uD��;]sMH�UP���|�f��t�H�UXH�4�Etǃ~u�H�EH9Fu�H�}��S���H��[]A\A]�fDH��1�[]A\A]��=���H��[]A\A]�ff.���u{AUATI��H��UH��S��H����E��H�4�H��H��I�D$HI���E��H��H��I�EM�l$H�E��M�d$HH��H��I�E�E��I�D$H��1�[]A\A]�fD���f.�U�FH�H��H��AVH���I��AUI��ATA��SH)�H��~WD�F�H�G1��8D��uKH�x��<��xD�NH�� ��f�|�H�~L9���H���8��u�H�P�R����1��H��~"H���H��S㥛� H��H��H��H��H�щ�H���_L��A���~XE��~-A�D$�H�KI��L�D���9I�� ���H��fA�E�I9�u�1�H�e�[A\A]A^]��Ic��x�����wt���;���H�e�[A\A]A^]�DSH�G`H��H�@ H��t��Cu1�[�H�{�H��1�[�H�G`�`f�AWI��AVI��AUA��ATU��SH��H�E��tE��A��tA����@����H��
!A�H�H������hL�������D$A���hC����L��D���@H��D�h�hL�0H�X`H�$�L�$=�t��uh�D$����H�{ t!H�
�
!L��H���L��L�$�A��L�$M�H��1�[]A\A]A^A_�H��	!H�H���P����(�����H��[]A\A]A^A_�@A��t�@��u�H��	!H�H��t͉�L��D��L����u�L�$I�X`�L���I�X(I�8I�PL�$H���xA����u�L�$H��L���UA��L�$���)����y���@E1��8Q���H�G`�`f�H�G`�`f��Gu
���@H�w ���H��f�H�G`H�@(��SH�GPH��H�@ H��t��Cu1�[�H�{�WF��1�[�H�GPH�@(��H��!H�H�]H��tH�B(�D�GuH�GPH�x tH��H�?H������=M��D1��D�Gu
���@H�w ��H��f�H�GP�`f�AWI��AVI��AUA��ATA��USH��H�E��t'D��A��tA����A����A���H��!�H�H����D��XL�������D$A���@��D��L��D���@H��D�hL�0D�`H�XPH�$�L�$=��������D$����H�{ t!H�
�!L��H�Z���L��L�$��>��L�$M�H��1�[]A\A]A^A_�fDH��!H�H���B��������H�!!H�H���"���������H��[]A\A]A^A_�@��t�H��!H�H��t�D��L��D��L����u�L�$I�XP�'���I�X(I�8I�PL�$H���~>����u�L�$H��L���I��L�$�������ff.�f�E1��(E���H�GP�`f�H�GP�`f�D�GD;G�L�OH�oD��H��I���oNHH�F�P�	������v@��t/�ҍB?A��I�A��A��B�����?H�D)�A�I��M	�@��t3�ҍB?A��I�A��A��B�����?H�D)�A�I��M	�����rt-�ҍB?��I�����2����?H�)�H��I	��A9��}A���A��1�D�G�f���f.�D�OL�FE��t7L�_H1�M���I�R0M9Bu��H�� L9B�t���AD9�u��fD��UA�i�SA�X�oA9�v^��)�I��H�I��H���7����o��H��L��oIJL9�t"L�FM���I�� K�
L9AuƃoL9�uޅۍC?��I�������H���?I��)�H�����H��H!H!��H!�A�����~9�t
1�[]�D��A���1���1��!���ff.�AWE1�AVAUATI��UH��SH��H���H��x4H��4�ׂ�CH��I��H��H��H��?H��H)�H�$Hi�@BH)�H�t$H�EHH�t$H��$�H��$�o )d$�oh)l$ �op )t$0�ox0)|$@�o`@)d$P�ohP)l$`�op`)t$p�oxp)�$��o���o���o���o���o���o��)�$��o���o��)�$�)�$�)�$�)�$�)�$�)�$�)�$����o��o��o� �o�0�o�@��)�$�o�P�o�`)�$ �o�p)�$0)�$@)�$P)�$`)�$p)�$��k>�����+�w�'�}���u1�E1�E1�A��WDM	�M��t<�oD��H��H���oZ1�f�QYH��tf�IM��tf�IA��A��D9m��H�uHD��H��H���zH�Jt�Et
H9M���IM���ɍy?A��I�A��A��D�����?D)�I��Hc�L��̐L���L��M��L!�M!�L�L��0����oD��H��H����oJf�qI�0���@�S1���H�Ę[]A\A]A^A_��E���E�4$E�H��t�H�UHH���H���@H�}�F������DA�$1���ff.��AVAUATUS�˃�������H��A��H�׾�I���8��A�H��H�EHL�����H�H�EHL��H������H�H�EHL��H�����H�L�uHD��L��H��Adž�H���8��H�mHH��L��I����8��H���1�[]A\A]A^�@H�GH�[]A\A]A^�f.�H�GH��[]A\A]A^�f.�AUH��I��ATI��H�rUSH�ӺH��H���=���Ņ�tH����[]A\A]�fD�M�,$�fA�D$H�A�D$I�D$H��x1��2�����tU�����H��x1��2�����t9H�C��x1���1�����t!�����H�C�x1���1������a����/���(H��[��]A\A]�USH��H��H�?H��t7�
:��H�{H���1�H��t
��9��H�C��D�H����[]�H�{1�H��t���9��H�CH����[��]�DATI��USH��H�D$H�l$H�\$�DH�|$uI�<$H��H���8����t�H��[]A\�f.�@H��!H��tH9�u�+DH9�tH��H�BxH��u�1��@H��xH�@xH�1��H��H�h!��fDH����AVE1�AUI��ATI��USH��H�G`�@DH�rH)�H�L��K�|5L)�H9�HG�H��I���8��H�C`H)�H�C`M9��}H�kXH�S@H��u�H��H�K8H�C@H�sHH�PH��HQ�PH�C@H�sHH��PH�C@H��H�C@H�sHH�PH��PH�C@H��H��PH�C@H�sXH�@H�C`�X���fD[]A\A]A^���ff.�@ATI��UH��SH��H��H��L$H��H�I�$H��H�PH��HQ�PH�H�t$�H��PH�H��H��PH��[]A\�ATUH��SH��H�7�H�WH�O8L�G@�G H���4���SH�C��t7��H��H��H�f.��@H���@�H�@�H9�u�H�C1�H�C H��H�HH�C0 H�4	H���H��H�S8L�bH��H��H�C(H�C@L`L���4��L��1�H���63��H�S8H��H�CHH�C@L�bL`L����3��L��1�H���
3��H��H�CPH�C@H�p��3���ct�H��H��H�CXH�
� H� @H� ���H�ChH��	!H�C`�CpH�CxH��	![]A\�2��f�AWAVAUATUSH��H��	!H��t`I���CtE�>L�c8L�k@H�kPL��L���D��<HEkHH����H�SHH9�tD��L��L�������k$H�C`H�[xH��u�H��[]A\A]A^A_��AU��ATUSH��H����2��H��H���^5��H��I���S5��H��I���H5��M��L��H��H��H���T;��H��H��[]A\A]�fDAWAVAUATUH��SH��H���I��I��E1�E1��B�H��sC�'��SH�M(H��H9��H9��=E�eM��M9����] H��H��H]���E ;Eu�E �C�p9ss�H�}���1��H�3H��H��t�SH����4��H���CH��p�6�S�f�������H�ME1�H��H�EH�H�xJ�4aH�?H��PH�EH�3H��L�P�CH�M��La��L9�w�H�M(�C�#���f�H�E�@H;E0sH��[]A\A]A^A_�@�EtL�eP��<H�E8LEeHH��H�E8H�M@L��H�PH��HQ�P�E��tXH�EE1�A��fD��t
D��D����}$t2A��D��H�M8H��H�H�ϋPH�0�QH�EA�V�D;Ur�H�U@H�E8H�rH��L�P�E$�Ut���E$��u>;Ehv9���Ut������H�E@H�U8H�}PH�uHH�RHP�U3���E$�Ut�Ep������ElEp9E$�����MtH�E@H�U8H�}HH�uPH�RHPH��[]A\A]A^A_�3���1����H�
�K��H�5kKH�=}K�J.��f.��GttH�����1�H���f.��<N�f.��GttH���Q���1�H���f.��<N�f.��G$�gt��Gp�D�Gt��<�%<N�ff.�@�Gt��<�%<N�f.�DH��t3fo
�Kfo�KH�G f�G(WG8GHGX��AWH��L��KAVA��/�BAUATUH�o(SD�I��D�_D�x�XD�hH�|$�D�`��@H�l$�D$��!�E�0A��D�d$�D��E��E��A��I����A�҉ىډ؋>����D!�H��1ʉ��A�9��I��1ʉ��D!�1��D$��D����
D���!�A�D���C�<71�D���
1�D��1�D!�1��H�KD�L9��e����l$�L�xH�l$�D�d$��D$�i���,@A�D�\$�I��E��D�l$�A��A��D��D$��D��D�aD���D�L�D��D��A������1�q��D1�D�L$�D�D�E��D��A��
A����
D1�A�΃�	A����D1�A��N�t�A!�AD���Ɖ�����A�61�����1�����D!�D1�E�����Ή��t$��
t$�1ȉ�E!�A�
1�D��D1�!�D1���A��@����H�D$�0PDPDXDHxXDh[]A\A]A^A_�H���AUATUH��SH��H���H��H���H�G I��H����?u]I��H��?�I�D$�H��L�l@f.�H��H��H��@�Q6��H�E L9�u�A��?M����H��[]A\A]�@�@)‰���H�|(I9�����rzH�L�GI��I��H�H�D�H�D�L)�I)�׃��r��1��ƃ�M�2M�09�r��HU H�I)�H�u(H��I���5��I��?�+����^���fD��������t�����t��D�f�D��DH�M(D��A��scA����E��tA�U�U(�tD��A�D�f�D�I��Le H��[]A\A]��L��I���-��Le H��[]A\A]�DI�EH�u0H��H�E(D��I�T�H�T�H)�A�I)̓��r���1҉у�I�|
H�<9�r��{������D��D�����A�U�U(D��A�D��D��R���H�
�F��H�58FH�=rF��(��DATUSH����H��H��H����H�F L�f(H��H��H�H�V ��?���P���D(���8����@��L��H���3��f�C(I�D$0AD$AD$ H�S H�S`L��H����3��1�@�ʉ�TH��H�� u�H�{H�1�H��H�C`H)��Kh���H�[]A\��f�F(AD$AD$ I�D$0�F(��D�8H�L(1�)Ѓ�s]������T������I�����1�f�D��;���@�@��)�H�t(�������1������9�r����fDH�q��H�H�D�H��H)�ȃ��������1҉у�H�<9�r���������D����H�
�D��H�5EDH�=QD��&��f�USH��(H����H��H��tcH��H��H����1��H��H��L�2DfD�H��H��H�D$ �փ�@��A�@��A�40@�q��Q�H9�u��E@H��(H�E@[]�H�WH��H��H�H��H�G`H)�H�׃�h���H�H��(1�[]�H�
�C��H�5uCH�=�C�&��f�AUI��ATI��UH��SH��xH��H����3��L��L��H���d+��H��H���#��H��x[]A\A]�f.�@H��H�w H����0���H� �'+���H� �3���U�(H��SH����&��H��hH����&��H�C H�C H�����H�H�����H�CH�����H�CH��H��[]��SH��H�w H�{(H�t�-�����tH�{(1��/����t1�[��k-�����u����[��DH�{(H�3[�)��ff.�H�(t)H��H�w H��(-��1҃��u�������H��������AWL�~AVI��AUI��ATUH��SH��H���H�Ͼ0I����%��H��L��H�(H��L�h�(��L�{ I��L��H�C(H�|$��G�-���Ņ�tH����[]A\A]A^A_�fDH�t$H�|$�����Ņ��H�s H�|$�!3���Ņ�t	����H�s D�D$E1�1����U"��H�|$H�C��'���Ņ�u�H�CH�S H��H�
g� H�;H�H��H�N���H�C�#��I��N���DH�Ͼ0��$��E1�A�����1�H�(�!�L��L�hH��L�x H�@(��!��H�CH���t6H�S H��H�;H��H�
�� 1�H�P�H����H�C�#��I���������(���@H�|$�'��H�{(H�3�'�����ff.�f��$��ff.��k'��ff.�H�G(H��tH�7H���L+��@���f�H��H�?H�3����/��ff.�AUATUSH��(H���I��I���0H��H���#��H��L��H�H����&��I��H�|$L��H�E(����x+����tH��(��[]A\A]�DL�d$H�t$L�������u�H�|$H�T$H�u H�D$�<%����u�H�t$L���������H�u D�D$E1�1���H�F�H�E�
 ��H�|$H�E�%�����`���H�EH�}H��H�p���H�
� H��H�E�<!��I�m�1���H��(���[]A\A]�fDH�|$�>%��H�}(H�u�%�����ff.���;,��ff.�USH��H����H�;H��H���������H����[]�DH�G�ff.�H�G�ff.�L�G(M��tOU�Љ���S��H��L��H���^(����t�u���H��[]�@���A ��H�{(���v)����u�H��[]����f�H��ff.�����f.����f.�USH��H��tu�_(�G���D$�����f�D$��~�����Mb�����H�l$�@�������u!�ھH���(�����t�w��t~1�H����[]�f��^(�F�������f.�DH���=.!H�=� H�5!L��H�!�H�
�!�]��1��� ��� H���f�SD�ˉ=�!H�=�� H�5�!L��H��!�H�
�!�
���{� 1�[�j� �f�SD�ˉ=�!H�=o� H�5x!L��H�f!�H�
R!����D$�'� [�� 1��f�UH��SH��H��H�����H�xH��H��Hǀ�H��1�H)�������H�H�UH��B@H�Bt����H��[]�ATA��U��SH�������t<�������D�H�CH�H�{��H���$����t_[]A\�f.���uH��� H�GA�����uMA��uH�z� H�C ���uh��u�H�c� H�S0[]A\�f.�H�{�����u�A�����t�H�H�s H�{D���'$�����p���H�{�V�����_������t�H�H�s0H�{(���#�����>���H�{([]A\� �������fDUH��SH��H��H�H��tK�1�H��t��H�tL�������H��tR��tNH�{H�H��tgH��H��[]����f�H�{ta�1�H��t�H�H�CH�{������t
H��[]�fDH�{�+��������H��H�{H��[]���fDH��H	�u�H�H�sH�{�����u�H�{H��[]���ff.�f�UH��SH��H��H� H��tK�1�H��t��H�tL�������H��tR��tNH�{H�H��tgH��H��[]����f�H�{ta�1�H��t�H�H�C H�{ ������t
H��[]�fDH�{ �*��������H��H�{H��[]���fDH��H	�u�H�H�s H�{�����u�H�{H��[]���ff.�f�UH��SH��H��H�0H��tK�1�H��t��H�tL�������H��tR��tNH�{(H�H��tgH��H��[]����f�H�{(ta�1�H��t�H�H�C0H�{0������t
H��[]�fDH�{0�)��������H��H�{(H��[]���fDH��H	�u�H�H�s0H�{(�����u�H�{(H��[]���ff.�f�SH��H�?���H��H�C8[����D�w@1��f.��wD1��f.�Sf�H��G�L)����xt��r[�D���[������H�߉�9&���q[�f�H�wh1��f��wp1��f.�1��ff.�f�SH��H��H��tH��H�H�t$�����u �{x�t
H��[�@�T$�SxH��[��Ct����H��[�SH��H��xH��&����t�Cx����[�AWI��AVM��AUATI��UH��SH��H��XH��H�D$(L�L$E�HpH�D$(HD�I�@H�GI�@(H�GI�@H�GE��t7I�x8H��t���"������LA�F@�����A�<$/�H�=� �D$$L�-� ��H�=� tzM��tuH�5�� L�������ubH��t]H�}H��tTD��� E���H�}1�H��t�D%����95\� }*H�T$$�
�� L��1��l� �D$��t�D$$�D$�3'��A����0��H�=2� t0H�!� H��t$H�=%� H��t�D$��tH�t$$1����I�~H��t
����I�~ H��t
���rI�~01�H��t
���MH��X��[]A\A]A^A_�@M�nM��tL���W��H��� L��H�����M�n M��tL���4��H�}� L��H������M�n0M��tL�����H�Z� L��H������"��I�FH��t!�x����e��t1��*��I�~����I�F H��t$�x����+��t����I�~ �S��I�F0H��t$�x������t�����I�~0�&���1��#��I�~8H��t���������~����u:M���M��t.fDA�NxA�VtA�uI�}A�U��t=�uiM�mM��u�A�~x���A�~t�t
�)������I�vHH��tx1������tm�h�������I�^hH��t�P��H��4H�|$�0�ӿ�������fD�L������������f.��������@I�vXH��t�������x���I�v`H��t��r�����]���I�vPH��t�	�W�����B���A�F@A��A���NH�F4H�D$0H�B4H�D$8H�EH�D$H����H��A����E�lD��I��J�|��H��u���H�|$Ic����H�uH�D$H����L�mI��fDH��H�t$I�����H�t$L��H��H���T��I�A� I�u�I��H��u�H�D$A�G�H�D$@H�D$HA�ND���7A�V@H�t$0����H��H�=P3����I�~h�Q���L�|$L��H�5<31�L���(��H���p��H��L���0A�Vh�����H�=� �:���H�� H���*���H�=� �����t$������H�t$$L��1�������������f���A�~x������U���I�^hH�����������H�Q2H�|$�0������������fD�������fD����a���fDA�~t� ���������I�^hH���2����m��H��1H�|$�0�������A�VD������������H��L���������f���V�������1��I�����@��6������H�=�1�t!���C�����?~�����H���6�������H�D$H�D$@������uQH��L���1!��������u1H��H��L��������������������5��������ÿ����L�|$�e���I�^hH��������3
��H�\0H�|$�0������ff.�AVI��AUI��ATUH��SH��H��H�D$L�d$LD�H��H�D$LD�1ۅ��Ã��f���	�����uL�}��L�������x�ti�T$�E�у�t;�q�.N@��~��������A��uA�MH��[]A\A]A^���A��uA�UH��[]A\A]A^øv�ɐ������ ��D��t+~��t4��uH�W`1�����u�H�WH1��DH�WP1��f�H�WX1��f�AUI��ATA��UH��� SH��H��H�?�
��H���L�hD�`H�hH�H���H��1�[]A\A]�S��H�=�!�
���������ut���H��� H�5s+H�=I/H����H��tiH��� H�58/H�='/H�����H��tGH�� H�5/H�=/H����H��1�H��t [�f���������t!�������u�������[��1�����H�=�.�����H��� H�=�.H��������f.��S�H���2��H�߾�%��H�߾���H�߾���H�߾���H�߾
����H�߾����H�߾����H�߾[����f�H���?���1҃��t��H���������H�����f�U��SH��HH��H�4$H�{���H��$�H�މ�DŽ$� ���H�������xH��$�H��HH��[]���ff.�@H�d-��xH��� Hc�H���fDATI��USH��H�\$H�l$H������	H�������H�������H�����H���q����H��H�������|$A�ԃ�u�H�Đ1�[]A\�ff.�SH�ĀH��H�����H���(���H��1ҿ�	��H��[�U��SH��H��H���Z����H�����H��1�1�����H�Ĉ[]�f.�U��SH��H��H�������H�����H��1ҿ���H�Ĉ[]��H�w�gf�H������UH��SH��@H��H���7
��H�EH�xH��g����tH��[]�@H�uH�߉D$H�����H�
g� ����D$H��[]�ff.�@��@��H��@�����ff.�f�H��H��H�t$�n��1��|$��H��s�f.�H������H���	���AVI��AUI��ATM��UH���(SH��L���L��f�L��@H�@ H��)��H�H�H�BH�H�xtQL�pH�;H��H�EHE�L��1�1�L�o�����t[]A\A]A^�f�H�H��[H�b���]A\H�yA]A^����f�[�]A\A]A^�f�����ff.�1�H9�����H���w H�?���1��Z��f.�UH��SH��H��H�CH�t$H�8������u�S �UH��[]�f�H�GH�8�t��@�+��ff.�H��h���H�	�����H�FH�1��fDH��t[ATI��UH��SH�H��H��tH�h1�[]A\��(H���
��f�@H�@ H�L� H�h1�[]A\���"N�f.�SH��H����o
��H��1�[�f�����ff.�H��f.�f�ATI��H��UH���SH���&
��f�H��H�xI�$H�[]A\����SH���~�d��H�1�[�ff.�f�H���~H�����f���H���H�����H�	�����F�1���H��t[ATI��UH��SH�H��H��t�U�P1�[]A\�f�H�׾�S	��f��UH�L� �P1�[]A\�f��"N�f.�Hi�@B1�H�7�H��1�H���r��Hi$@BHD$H���UH���H��4�ׂ�CH��H��SH��H��?H��H��XH)�Hc�H�Hi�@BH�D$H)։7H�t$H�|$����H�D$�k(H�CH�D$H�CH�D$ H�CH�D$(H�C�D$0�C$H��X1�[]�f.�1��Y��f�H��4�ׂ�CH��SH��H��H��H��?H��PH��H)�H�T$Hi�@BH)։7H�t$H�|$�j��H�D$H�CH�D$H�CH�D$ H�CH�D$(H�C�D$0�C$H�D$8�C(H��P1�[�ff.�@LcVHcNA�$NA����H�ףp=
ף1�A����H)�L�IH��LI�H��H��I��I�H��H��H�H��?H��H��H)�H)�L�L�JH��IH�H��L�H�&�FB���H�I��\���H�@HcFH��H��H��H)�HcVH��H��H��H)�HcVH��H��xHi�@BHcE1�H�H�D���ff.�@UH��SH��H���?�����uHcU(Hi���HH��[]�fDH��4�ׂ�CL�H�>H��H��H��H��?H��H)�Hi�@BH)�I�xH�6H��H��?H��1�H��H)�I��@H��V��V�P�V�P�V�P�V�P�V�P�V�P�V �P�V$�P HcV(H�P(1��ff.�f�H�Hi@BHBH�1��ff.��H���W�P�W�P�W�P�W�P�W�P�W�P�W�P�W �P H�@(�W$�G(1��ff.�H��H��1�1�H��4�ׂ�CI��H��H��H��?H��H)�Hi�@BH�$1�H)�H�|$1�����H���fD�ff.�@�f.�DSH��H��0H������HcL$�t$���QH�s� H�����gfff��P�S�@�C �C�, f�C������)B0�C��H�� �)ƃ�0@�sHct$H�����S�P�S	�@��Mb�C �C
�D$�C ��l�C:��A��A���A����D)B0i���CA)�D��A�����D)ʃ�0�S
�����D)�k�d)�������)���0�S��D)��)ƃ�0@�s�t$������)B0�C���)ƃ�0@�s�t$�C:���C GMT����C����)B0�C���)ƃ�0@�s�t$������)B0�C���)�1���0@�sH��0[ÐSH��H��0H���0��HcL$�gfffH��� ���QH����HcL$��P�SH�}� �@�C �CH�����L$�S�P�S�@�C �C�����C
 ���C
:�C:��)B0�C���)���0�K	�L$�������)B0�C���)���0�K�L$�������)B0�C���)���0�K�L$�������)B0�C����Mb�)���0�K�D$�C ��l�C��A��A���A��D)B0i���CA)�D��A������D)ʃ�0�S��ȉ��D)�k�d)��������)���0�S��D)��)�1���0�KH��0[�f�Sf�H��H��H��H��@M�HA�@$H��D$$L�$M�H�A4L�L$M�H�D$ Ic@(L�L$M�HH�D$(L�L$�f	��H�H��@1�[�f.��AT� I��UH����SH��0 H�T$0H�t$L�D$����Å�uH�D$H��t$H�0L���Y��H�EH��0 ��[]A\��H��0 ���[]A\�ff.�f�S� H��H��H��0 H�T$0H�t$L�D$�����uH�T$H��t�R�H��0 [�D���AT�I��UH��H��SH��@H�T$@H�t$L�D$�S���Å�uH�|$t%H�t$0L�����H�EH��@��[]A\�fD���f�UH��SH��H�������E�w���H��1�[]�ff.��U�H��H��SH��H��HH�T$@H�t$L�D$�����uH�|$t�T$ �U�T$$�H��H[]�f����f�AT�I��UH����SH��@H�T$@H�t$L�D$�����Å�uH�D$H��t$H�0L�����H�EH��@��[]A\��H��@���[]A\���H��H����%���'��e'��`'���'��M'��H'���'���)��P+��5+��0+��p+��%+�� +��`+��0123456789abcdef0123456789ABCDEF0123456789ABCDEFGHIJKLMNOPQRSTUVABCDEFGHIJKLMNOPQRSTUVWXYZ234567ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/	 



                                                	   �   

                                                                                                                                                                                                                                �   	

                                                                                                                                                                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@?456789:;<=@@@�@@@	

@@@@?@ !"#$%&'()*+,-./0123@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#%3.3d;lt<gt>amp&ETH�eth��=���>���>���>��`=��@=���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>�� =���>���<��>���>���>���>��|>��>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>��\>���>��\>���F���F���F���F��xF��`F��HF��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��(F��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G���E��0123456789abcdef��������������������������������1���PPWww����������������������������������������������������������������������������������������������������������������������������������quot"Auml�Euml�Iuml�Ouml�Uuml�auml�euml�iuml�ouml�uuml�yuml�Acirc�Aring�AElig�Ecirc�Icirc�Ocirc�Ucirc�THORN�szlig�acirc�aring�aelig�ecirc�icirc�ocirc�ucirc�thorn�Agrave�Aacute�Atilde�Ccedil�Egrave�Eacute�Igrave�Iacute�Ntilde�Ograve�Oacute�Otilde�Oslash�Ugrave�Uacute�Yacute�agrave�aacute�atilde�ccedil�egrave�eacute�igrave�iacute�ntilde�ograve�oacute�otilde�oslash�ugrave�uacute�yacute�	

 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������bogus %pnaninf�e���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d��f���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���k���d���h���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d���d��h���d���d���d���d���d���d���d���d���d���d���g��!p���k���k���h���d��!p���d���d���d���d���o��Po���n���d���d��n���d���m���d���d��h��0123456789abcdef0123456789ABCDEF0123456789abcdef0123456789ABCDEF(null)��������$@���Q��?�?�������%3d %d.%d%c%3d%c, No Error..//apr-tmp.XXXXXXTMPDIR/usr/tmp/var/tmpTMPTEMP/ApR.%xH%x/ApR.%lxZ%lx/dev/zero/tmp/aprXXXXXXflockfcntlpthreadsysvsemposixsemd��4�������L�������� ��� �����( ��P �����( ��apr_global_poolISO-8859-1Could not perform a stat on the file.A new pool could not be created.An invalid date has been providedAn invalid socket was returnedNo process was provided and one was required.No time was provided and one was required.No directory was provided and one was required.No lock was provided and one was required.No poll structure was provided and one was required.No socket was provided and one was required.No thread was provided and one was required.No thread key structure was provided and one was required.No shared memory is currently availableThe specified IP address is invalid.The specified network mask is invalid.Could not find the requested symbol.Not enough entropy to continue.Your code just forked, and you are currently executing in the child processYour code just forked, and you are currently executing in the parent processThe specified thread is detachedThe specified thread is not detachedThe specified child process is done executingThe specified child process is not done executingThe timeout specified has expiredPartial results are valid but processing is incompleteBad character specified on command lineMissing parameter for the specified command line optionCould not find specified socket in poll list.Shared memory is implemented anonymouslyShared memory is implemented using filesShared memory is implemented using a key systemThere is no error, this value signifies an initialized error codeThis function has not been implemented on this platformThe given path was above the root pathThe given path is misformatted or contained invalid charactersThe given path contained wildcard charactersThe process is not recognized.Internal error (specific information not available)Error string not specified yetAPR does not understand this error codeDSO load failedEnd of file foundpasswords do not matchThe given path is absoluteThe given path is relativeThe given path is incompleteThe given lock was busy.Unknown hostNo address for hostUnrecognized resolver error%s: %s: %s
%s: illegal option -- %c
invalid optionmissing argumenterroneous argumentinvalid option character%s: %s: %c
%s: option requires an argument -- %c
/dev/urandomapr_initialize1.7.60123456789ABCDEF0123456789abcdef0123456789epollunknownselectrandom/unix/apr_random.cp->bytes < g->rehash_sizeapr_random_add_entropyrandom/unix/sha2.ccontext != (SHA256_CTX*)00123456789abcdefcontext != (SHA256_CTX*)0 && data != (sha2_byte*)0apr__SHA256_Endapr__SHA256_Finalapr__SHA256_Updateg�	j��g�r�n<:�O�RQ�h��ك��[�/�B�D7q����۵�[�V9��Y��?��^����[���1$�}Ut]�r��ހ�ܛt�i��G��Ɲ�̡$o,�-��tJܩ�\ڈ�vRQ>�m�1��'��Y����G���Qc�g))�
�'8!.�m,M
8STs
e�
jv.��,r��迢Kf�p�K£Ql���$�օ5�p�j��l7LwH'���4�9J��NOʜ[�o.htoc�xxȄnj�����lP������xq�change of working directory failedsetting of resource limits failedsetting of group failedsetting of user failed/bin/sh-cexec of '%s' failedforkunable to fork new process
/dev/nullwunknown signal (number)2Q=\z����SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec;��������X4��j�����@��xP������(���������0���H��������`��(��������p	��(`
��x�
������(���������� ��\@���P�����t�������� ��,��x���� ��( ���\ @!��� �!��� @#��<!�#��p!�&���!`'��0"�,���"-���"@0��D#�0���#P1���#�1���#�3��H$P4���$�5���$06��(%�6��`%�6��t%p:���%�:���%�:��&@;��D&�;���&P<���&0=��'�=��H'�=��\'P>��p'�>���'�?���'�?���'�?��(�@��P(�@��d(�@���( A���(�K��)0L��,)`M��x)N���) N���)�P���)�Q��*�w��P*�x��t* y���*�y���*�y���*z��(+@z��T+�{���+@|���+�|��,�|��<,�|��P,0}��l,�}���,�}���,@���,���D-���X- ���p-���-P����-`��� .����<.���d.����.`����.�����.���.����. ����.@���/P��� /0���H/P���`/��/����/P����/���00���D0�����0�����0Ћ���0��0�����0��1Ѝ��@10����1����1P���2����t2 ����20����2���2��2���3���3 ���,3P���@3��3 ����3@����3`����3p����3����l4�����4@����4`����4p����4�����4����5�5����t5К���5�����5�����5��6�(6���<6���P6 ���d6�����6�����6@����6����$7��87P���t7`����7�����70����7����8`���D8����8@����8p����8����9����09����D9���p9`����9p����9P���:�h:`����:����;���d;P����; ���<����@<0���p<��<����<����=@���x=���=P����=`����=p���>����$>����8>����L>����`>����t>н���>���>��>����>����> ����>0���?@���?P���,?p���@?����T?����h?�����?����?����?����@п��(@���T@@���p@���@��@���A���A���0A���HA`���A����A`���A���B��� B���\B���tB���Bp���B����B����B0���B���C���$C��8C ���C0���CP���Cp�� D���`D��xD`���D`��Ep��E���0E���HEp���E���F���0F���|F���F@���F���@G���tG`���G��H���\H���Hp���H��� I���pI����I0���I���0Jp�|J���J���J���J���J�� K��4K�LK@�dKp�|K���K���K���KP�L��$L��8L �XL���L`��L��M��$M��pM���M���M ��M`��M��N��8N��LN�tN���N��N��<O��TO���O �Op�P��DP �pP��Pp��Pp���Q ���XQ@����Q@����Q����R`���pR�����R`����R����S���,S ���TS�����S����S ����S@����SP���T`���Tp���(T����<T����PT����dT����xT�����T����T0����T�����Tp���U����(U����@U����TU`���U����U ���U0���Up��V��|V0���V`���V����V����V���4W���TW ���W����W����W@��X��lX����X 	���Xp	���X�	��Y0
��<Y�
��\Y�
��|Y����YP���Y���Z 
��@Z�
��tZ�
���Z���Z����Z���[���$[���8[���L[p���[����[����[����[����[���[0���[@��\P��$\���8\���L\p���\����\����\���]��]���X]���l]����]����]����]���]���^��� ^ ��8^���l^����^����^���^���^p���^���_���_���,_���D_���X_��l_���_`���_����_P��L`���l`����`����`����`���`���`���a���0a� ���a "���aP%��,b�%��Hb�'���b0(���bP*���b�-��Tcp0���c�0���c�4��d@5�� dP5��4d`5��Hdp5��\d�5��pd�5���d�5���d�6���d7���dp7��e 8��Te�8���e�8���e�9���e�9���e�9��f�9��$f:��8f0:��df@:��xfP:���f`:���fp:���f�:���f�:���f�:���f�:��g�:��(g ;��Hg@;��`gP;��xg�@���g�A���g B��(h�B��`h E���hpH��`i�H���ipI���i0J��,j�J��Dj0K���jpK���j�K���j`L�� k�L��<k�L��PkM��dk M��xk@M���kPM���k�M���k�M���kO��$l�O��Pl�O��hlpP���l�R��m�S��`mpV���mW��n@Y��\n�Y��|n�Y���nZ���n0Z���nPZ���n�Z���n�[��4o�\��po�]���o�^�� p`��ppc���pe��qPe��Dq�e��Xq�h���q�i���q�k��\r`m���r`n��s�o��ps�p���s�q���s`r��(tpv���t w���t�w���tpx��0u`y���u�y���u�z���u�z��v{�� v {��4vP|���v�|���v�|���v}��w@}��w����lw�����w�����w���wP���,x`���@x@���lx�����x�����xp����x���y@���8y����Xy ���|yЌ���y���y����yP���z����<z���Xz ���lz@����z`����z0����z���4{@���x{�����{В���{@����{`���@|����x|���|@����| ����|0����|�����|P���}����X}�����}0����}p���(~����H~����\~P����~`����~p����~�����~��������(��H�\���p@����`����p����P����`���$�p���8�����P�����d�����`����`���@�@���������������`����`���D�����t� ������������� �а���������0�����@���̃`����������������P�P���Ą@�������,�`���h�p���|��������������ЅP����������p���\�����p�������������м����@�����P��������8�����L�����`����������� �����0���؇п��� ��� �p���<�����X� �����@��Ȉ@���@��`�@����`��ȉp��܉�����������,����@���T�P����p����0�����L���`�`��t���������؋0���`������@����T����h�p������������� ���0��$�@��8����l�������������� ������� ����4���H� ��\�P����`����p������������Ԏ������$�0��@�@��T�P��h��������������ď���؏�����������p��P����d����|�0����@�������ؐ��������@��(����<����P���d�P��|�`����p���� ��̑����0������P��x�p�����Ԓ��zRx�$����0FJw�?;*3$"LD���1B�E�D �D(�G0�
(A ABBI�
(F AEBH4�x���K�A�A ��ABE���P ���T�@���B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBT$x���B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBB`|����B�E�D �D(�G0i
(A ABBKe
(A ABBEj
(F AEBH`�<��B�E�D �D(�G0f
(A ABBF^
(A ABBDj
(F AEBHTD���B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBT����B�B�B �A(�A0�D@^
0D(A BBBKF0D(A BBBL�(��B�E�D �D(�G0b
(A ABBBZ
(F AEBH4D���K�A�A �XABH���P ���T|0��B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBT�h��B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBL,���B�E�D �D(�G0�
(A ABBAz
(F AEBHL|@��B�E�D �D(�G0�
(A ABBBz
(F AEBHT���B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBT$�B�B�B �A(�A0�D@^
0D(A BBBKF0D(A BBB\|`�ZB�E�D �D(�G0�
(A ABBG`
(A ABBBz
(F AEBH �`�m�D�X�TL�B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBTX��B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBB\���B�E�D �D(�G0�
(C ABBD�
(C ABBGj
(G AEBC\|���B�E�D �D(�G0�
(C ABBB�
(C ABBHj
(G AEBCTp,����B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBX�d����B�B�B �A(�A0�D@^
0D(A BBBKF0D(A BBB$$����-P��F�X�U
A0L����aA�M�G0R
DADkDAH����B�B�B �B(�A0�A8�Dp;
8C0A(B BBBKh������B�J�H �G(�K0�GHFPFHA@aHHP\HA@D
0D(A BBBAD0F(A BBB@8	���hQ�E�C �CBJ���X ���P
FBA0|	�aA�M�G0R
DADkDAX�	,����K�B�E �D(�D0��
(A BBBEY
(F BBBAj�����<
���nB�H�J �G0R
 DABDn DAB@L
����Q�E�C �'CBK���X ���P
FBA0�
���aA�M�G0R
DADkDA|�
8��4K�E�E �E(�A0�D8�DP�
8C0A(B BBBDH������XP�������
8F0A(B BBBF<D���nB�H�J �G0R
 DABDn DABd�(��>B�B�B �B(�A0�A8�D�
8F0A(B BBBDd
8C0A(B BBBH0�
��aA�M�G0R
DADkDAt <
��&R�F�E �I(�D0�A8�1
0C(B BBBI8������X8������P
0F(B BBBA<����nB�H�J �G0R
 DABDn DAB�$
���H��
��mB�G�D �D(�G@R
(D ABBEk(D ABB`8
�
��B�B�B �B(�A0�A8�D`�
8A0A(B BBBCd8F0A(B BBB<�
���kB�G�G �K(�D0�F@z0D(A BBBL�
���fK�L�D �A(� ABBH����R(����A FBBL,���mB�G�D �D(�G@R
(D ABBEk(D ABB4|��dB�D�D �F
ABEFCB�8��CH�t��tB�B�E �B(�A0�A8�G`L
8C0A(B BBBA���A�X(0���NB�D�A �~AG8\���RI�D�D �g
FBHACBA���8����RI�D�D �h
FBGACBA���@����A�A�D [
DAJD
IAJF
DAED����B�B�H �E(�A0�D8�DP�8A0A(B BBB8`��IB�J�J �G(�D0�`(A BBB�0��i����S����\H�$���B�E�E �E(�D0�A8�GP]
8C0A(B BBBJ$���8���0A�T YAHX����B�E�E �E(�D0�A8�GPR
8C0A(B BBBE�(���4��5A�Y YA(�T��6B�D�A �kABdh���
B�H�B �B(�D0�D8�D��
8A0D(B BBBAH
8F0A(B BBBGl�"��cH��"��%B�B�J �B(�D0�A8�J��
8D0A(B BBBF��#����|$��H�x$���B�F�E �H(�A0�A8�Gp
8D0A(B BBBD@�&���LT�'���%B�E�E �E(�D0�D8�G�s
8A0A(B BBBA �(M��A�J��
AF(�$N��sA�G r
AEqA,�xN��VG�D�F �wABE���($�N��>F�H�G [AAF��(P�N��6F�D�J WAAC��(|�N��3F�G�G IG�E�D��N��]B�B�E �D(�A0�F�)
0D(A BBBH4��O���B�A�A �k
ABFcAB8(dP��?B�E�E �D(�D0�c(A BBB(dhP��*B�D�D �XAB�lP���hP��cA�a��P��sA�q� Q��@�Q��{A�L �
DJm
ABm
DGQ
AF`4XR���B�E�B �B(�A0�C8�F``
8A0A(B BBBAR
8A0A(B BBBD��T����T��
L��T���B�E�D �D(�D0v
(D ABBFD
(C DBBIU��pH(tU��B�E�E �B(�A0�A8�DPz
8D0A(B BBBEt8V��A�U$�<V��~A�D�D0oDA��V��A�M��V��L��V��:A�t�V��1W��D W0W��D WH$W��D W`,W��$t(W���A�D�G �AA��W��DW@��W���B�A�D �d
ABBX
ABEKAB�DX��$@X��MA�I�D |AAL4hX���B�E�E �B(�A0�A8�G��
8D0A(B BBBC��Z��
<��Z���B�D�D �D@`
 AABFD FAB�[���[��[��,([���B�A�D �u
ABAD�[��Nla4\�[���B�D�A �g
ABG�FB`��\��]K�B�E �B(�A0�D8�G@
8A0A(B BBBB`������C@������H��]���B�B�E �B(�A0�A8�DPb
8D0A(B BBBHD^��JlXD^��BB�B�D �A(�D0a
(D DBBF[
(D ABBDK
(A AEBDt(D ABB�$_�����_��<��_���B�A�A �G@~
 AABCP CAB0�_��D�_��X�_��l�_����_��#H�`���B�E�B �E(�D0�A8�Dp�
8D0A(B BBBG�\c��#�xc���c���c��T0�c��+B�E�E �A(�D0�D@Z
0A(A BBBI�0A(A BBB zRx�@�����(P����,d�� 0�8d��yA�D�G@Z
AAHFAA�d���d��0�d��D�d��X�d��CXl�d���K�E�A �D(�GP�
(A ABBJD(C ABBD����HP�����De��	D�@e���B�E�B �E(�A0�E8�DP�8A0A(B BBB($�e��/B�D�D �aABP�e��DQh�e��|�e����e����e��4��e���B�D�H �q
ABFtAB�f��D f��uB�A�D �J�g
 DABA� AAB(L @g��sA�A�G Z
AAKx �g��8� �g��jB�E�E �D(�H0�J(A BBB� �g��� �g��,A�`
GC(� �g���B�A�A �Z
IBG0(!Th��kH�D�G UFAA��P ��8\!�h���B�B�E �A(�D0�s
(H BBBA8�!i���B�B�E �G(�I0�}(A BBB$�!xi��:A�D�L fAA$�!�i��&A�D�D WDAH$"�i��B�B�B �E(�A0�A8�DP�
8A0A(B BBBGp"\j���"Xj��(�"dj��SB�D�H �AAB8�"�j��PB�E�G �I(�D0+(D ABB#�k��X#�k���K�B�A �A(�D0�
(A ABBED(C ABBA����C0����Hp#,l���B�B�B �E(�A0�D8�D`g
8A0A(B BBBAH�#�n��oB�E�B �B(�A0�D8�D`7
8A0A(B BBBAH$�p��'B�G�B �B(�A0�A8�Dp�
8A0A(B BBBA`T$�r��gB�E�B �E(�D0�A8�DP�
8A0A(B BBBGC
8A0A(B BBBC`�$�s��HB�E�B �E(�A0�A8�DP�
8A0A(B BBBFg
8A0A(B BBBG<%�t���B�B�E �D(�D0��
(A BBBA4\%u��cB�B�A �G(�D0I(D ABB,�%Hu���B�H�D �n
ABA4�%�u���B�E�D �I(�D0�(D ABBH�%@v��B�B�E �E(�A0�A8�Dp�
8A0A(B BBBBH&x���G��dd&xx���W�B�B �B(�A0�A8�G�J������H�������
8A0A(B BBBHL�&�}���B�B�A �A(�D0P
(A ABBHf
(F ABBG'��bA�U0JA<'`��P'\��d'X��x'T���'P���'L��
�'H��
�'D���'@���'<��	(8��(0��0(,��D((��	X($��l( ���(���((��	�($���( ��/A�`
GF(�(0��?B�I�G �iAB)D��
H)@���B�B�L �D(�D0]
(C ABBCM(F ABBh)���(|)���@A�D�G [
AAG�)���0Y�V8�)����B�E�A �D(�G0T
(D ABBH*,���@*(����B�M�H �I(�D0�G�A�
0C(A BBBJX*����l*�����*x���DXH�*�����B�H�E �A(�A0�^
(C BBBHF(A DBB�*ā��@�*Ё���B�B�B �D(�D0�I� �
0C(A BBBB@+l���DOX+t���"A�`8t+����B�E�A �C(�G0^
(D ABBG�+l���DT�+t���4�+����XA�D�D0P
CACsCA,����
(,����<,�����P,,����d,����x,����x�,����B�B�B �E(�D0�D8�G@e
8A0A(B BBBG_
8A0A(B BBBGX
8C0A(B BBBD-d���
-`���D X<4-h���B�B�D �I(�J0}
(C ABBH<t-H���fB�I�D �G� f
 CABFY AAB�-x���DT$�-����VQ�G�N kCAd�-�����B�B�B �B(�A0�A8�G��
8A0A(B BBBAN
8F0A(B BBBA\.P���
p.L���
�.H���	H�.@����B�B�H �E(�D0�A8�DP�
8C0A(B BBBEh�.Ԍ��	Q�B�B �E(�A0�D8�DP�
8C0A(B BBBDO8C0A(B BBBE������,T/x���bB�A�D �"
ABDH�/�����B�B�D �D(�J�x
(A ABBDq(A ABBH�/�����B�B�D �D(�J�x
(A ABBDq(A ABB0@���+A�^
AFT<0P����B�B�E �I(�D0�I�b
0A(A BBBGu
0A(A BBBC0�0�����R�D�D �N�F
 AABF<�0����B�I�D �M�X
 DABE� AAEX1�����B�E�J �D(�A0�I�`
0A(A BBBIz0A(A BBBHd1���B�H�G �A(�DPQ
(C ABBAO(A ABB0�1,���nB�L�D �D@S AABD�1h���iB�E�E �E(�A0�C8�GPB8A0A(B BBBD,2����iB�E�E �E(�A0�C8�GPB8A0A(B BBBLt2�����B�B�E �B(�D0�D8�D`�
8A0A(B BBBB\�2���!B�B�E �D(�D0�D@K
0A(A BBBHY
0A(A BBBG($3ؓ��sB�A�A �}
ABD0P3,���IA�A�G b
AAKNAAH�3H����B�D�E �B(�A0�A8�D`�
8D0A(B BBBF�3���3����DT�3���DT4���H(4����B�J�E �D(�G0�n
(C BBBEd(D FDBt4�����4����%F ^�4����%F ^�4ԗ��%F ^�4��
�4��
�4��
H5���A�A�D X
CAFT
CAHI
CAKKACX5D����a�S
DFx5�����5����.DR
JK`�5����vB�B�B �E(�D0�D8�GP1
8C0A(B BBBIK8A0A(B BBB46ܙ���A�F�D J
CAGK
CAAH6d���RS�S�d6����Hx6�����B�H�I �C(�G0�
(C ABBC\(A ABB�6H���
�6D���,�6@���<B�G�D �G0c AAB,7P���?B�J�D �G0c AABL7`���+A�^
AFl7p���7A�d
KF�7����
$�7����'A�D�G IGF,�7�����R�A�A �O
ABJH�7���]B�B�E �E(�D0�A8�D@�
8A0A(B BBBFHD8����B�B�B �E(�A0�D8�D@�
8D0A(B BBBA�8l���%D `H�8����
B�B�B �B(�D0�D8�GP
8D0A(B BBBE�8H���,D0g`9`���JB�E�E �D(�A0��
(C BBBFM
(E BBBHO
(C BBBH$p9L���?A�A�D tCA(�9d���aA�A�G C
CAH(�9����aA�A�G C
CAHH�9���B�B�B �B(�A0�A8�DPy
8D0A(B BBBD,<:�����A�D�J��
CAA<l:P����A�D�G f
CAJm
AAAsAAL�:����B�E�D �A(�J�[
(C ABBGf
(A CBBB4�:����A�A�G0o
CAD{AC$4;X���kA�X _
CEfDd\;�����B�I�B �E(�A0�K8�G��
8C0A(B BBBHr
8F0A(B BBBG0�;��;A�A�G a
CABDAAH�;��B�E�H �I(�D0�V
(C BBBEe(A BBBD<h���$X<t���CA�D�D uCA$�<����CA�D�D uCA8�<Ĩ���B�B�D �A(�G0
(C ABBI0�<(���;A�A�G a
CABDAA=4���,=@���@=L���	T=H���	h=D���	|=@���	�=<����=8����=4����=0����=,����=(���TA�U
Js$>h���SY�D�G jCA(<>�����A�D�D0�
AAFh>T���|>`���DX�>h���8�>d����B�B�A �A(�G`�
(A ABBD�>ȫ��(TS8�>���B�E�D �D(�D0]
(A ABBJ8?4���DKP?,���3A�e
JA\p?L����B�H�K �D0
 CABFK
 CABG[
 CABGL CAB�?|���)DS
ID�?����)DZ
BD@����DV(@����;A�p
GA<H@ĭ���A�D�D0~
CAEO
AAGVAA�@T���>A�p
GA(�@t���OA�I�p
CCKA0�@����[A�H�G r
CAJDAA0AĮ��[A�H�G q
CAKDAA0<A�[A�H�G q
CAKDAALpA����B�A�A �G0�
 CABDO
 AABEV AAB@�A�����A�K�I L
CAKZ
CABK
ACAB���IKfOD$BH���IKfODDBx���6A�m
BA(dB����yA�A�G I
CAJ�B��FA�t
KA�B���FA�t
KA4�BL����A�A�K h
CAGL
CAH(C���A�A�K m
CAB04Ch���[A�H�G t
CAHDAA(hC����iA�A�G y
CAJ0�Cز��[A�H�G s
CAIDAA0�C���[A�H�G s
CAIDAA�C0���D<����<$Dȳ��B�E�J �G(�C0��
(A BBBFdD����xD�����D����0�D����zA�D�G R
AAHOAA�D���D���D��Eܴ��	$Eش��HD`C<E���%PE,���dE(���xE$���"�E@���X�E<����K�E�E �D(�C0�F@�
0A(A BBBI������P@������E����F����	,(F����^B�D�I �G0C AABXF��
<lF���B�E�A �H0f
 AABFO AAB�F@���	�F<���	�F8����FD����F@���	LG<����B�H�I �D(�D@w
(C ABBFb
(C ABBF`G̷��	tGȷ��!D\0�G���A�E�D0f
AAF[AA�GL���	�GH����GT����GP���	,HL���^B�D�I �G0C AAB@H|���	THx���DXlH����	�H|���DX�H����	�H�����H�����H����CA�AD�H�����K�B�B �A(�D0��
(A BBBA������d8I���QB�B�B �B(�A0�D8�DP�
8C0A(B BBBG�
8F0A(B BBBE�I����7A�l
CF(�I���@B�D�H �gDB�I0���J,���J(���(J$���0<J ����A�D�G ~
AALoAApJ|���&L�J����	B�B�A �H(�K0v
(D ABBID
(F ABBA,�JX���7B�A�D ��
ABHxKh���)B�B�B �E(�E0�E8�DP�
8A0A(B BBBIK
8A0A(B BBBKT
8C0A(B BBBH�K��&A�dL�K0��WB�B�A �D(�D0�
(A ABBAt
(D ABBK�K@��Kdf8Lx��B�B�A �A(�G0�
(A ABBBd@L\��DB�B�E �E(�D0�D8�D@-
8C0A(B BBBEq
8F0A(B BBBH<�LD���I�B�B �A(�A0��
(A BBBE�L���X�L���"B�B�E �D(�D0�D`�
0D(A BBBJ�
0D(D BBBFXM����G��tM���M���M���M���M��&�M$���M ���d0[
AN��2J�XF�D$N(��dG�E�D �D(�G0k(A ABBD����H0����8lNP���B�E�D �D(�G0M
(C ABBE0�N���kB�D�D �G0r
 CABG4�N��TK�D�D �cABG���H ���O(���(O���1$<O���A�D�G IGAdO���xO���(�O���-B�I�C �[AB�O����O����O����O���P���P���0P���DP��� XP���4A�[
LG|P���'A�V
IF�P���DN�P���DKD�P���pA�D�G c
DAD_
DADc
DAH(Q���J�D�D ��AJ8@Q���MB�B�B �D(�A0�w(D BBB4|Q����B�J�G �D(�F0�(C ABB��Qx��@B�B�B �B(�A0�A8�DP�
8C0A(B BBBDq
8A0A(B BBBEG
8F0A(B BBBBs
8F0A(B BBBFdLR ��EB�B�B �E(�D0�A8�G`�
8D0A(B BBBOv
8D0A(B BBBE<�R��sM�A�D d
CAFaAAA��C ��8�RH��xB�H�J �D(�D0�P(A BBB80S����w�H�G {
AAE\
AAAL��lS����
�S���[ZW<�SD��J�H�G0j
AAKYAAE��H0��(�S��2A�C�D gAAT�� A�G VAL$T���B�I�E �G(�D0�Q
(A BBBE|
(A BBBAtT8�d0N
F�T���T���T���T���T���T��!U��dy�b
ECH,U�B�B�B �B(�A0�F8�DP�
8C0A(B BBBF(xU��bB�I�G �JCB�U(��U0���Q|�U��rB�B�B �B(�D0�A8�D�h
8A0A(B BBBE]
8A0A(B BBBA�
8A0A(B BBBG\TV���B�E�B �B(�D0�C8�K`�
8F0A(B BBBDl8C0A(B BBB|�Vx��B�E�B �B(�D0�A8�Dp^
8A0A(B BBBDO
8A0A(B BBBGy
8A0A(B BBBE(4W���A�C�G0j
CAGL`W��=B�B�A �D(�J�o
(A ABBH
(A ABBG�W���D0^
Fm
K�WL��WX��Wd�Xp�( X|��A�G Z
AEm
AJ8LX���B�D�D �I
CBHN
IBG8�X���B�D�D �Q
CBPN
IBG`�X8��B�I�E �E(�D0�A8�GPG
8C0A(B BBBD_8A0A(B BBBH(Y��BB�I�E �F(�D0�A8�GPn
8C0A(B BBBDLtY��B�E�E �D(�D0�i
(A GBBGN
(A IBBDL�Y���B�B�E �B(�D0�D8�G`o
8C0A(B BBBKXZ8�B�B�B �D(�D0�D@D
0C(A BBBH9
0F(A BBBA$pZ��1A�D�G [DA�Z�L�Z��B�F�B �B(�D0�A8�G��
8C0A(B BBBI4�Z���A�D�G `
AAB�
FAFx4[����/B�E�B �E(�D0�D8�Dp]
8F0A(B BBBJW
8A0A(B BBBGc
8C0A(B BBBIl�[L����B�H�A �D(�G0D
(M ABBLa
(A ABBAD
(F ABBA�(C ABB< \�����R�E�E �D(�C0��(C BBBF�����``\L���rB�B�E �A(�D0�I�y�S�H�A�k
0C(A BBBG��G�F�A�L�\h����B�A�A �G�r
 CABEG
 HABFG HAB8]���3B�B�A �D(�G0q
(A ABBI(P]���xA�C�D {
AAKd|]0���B�G�B �B(�A0�A8�D`�
8A0A(B BBBK�
8C0A(B BBBH�]����@�]t���b�A�D �J0\
 AABGO
 CABCD<^����V�B�D �D(�G0z(A ABBI����H0����L�^8���B�J�D �A(�G�U
(A ABBEW
(C ABBA(�^���KA�A�G t
AAA(_����B�D�D ��AB$,_���7A�C�G iAAT_���)A�W
HFt_���`�_���,B�E�L �E(�A0�A8�GPN
8A0A(B BBBGn
8C0A(B BBBF�_���!D\`���<`���nA�D�K n
AAHR
CABKAAX`��!D\Lp`��=B�J�D �D(�G��
(C ABBG^
(A ABBD@�`	���B�F�E �D(�A0�D@�
0A(A BBBHa�
��(a�
��GB�A�A �}CB8Da�
��dB�E�J �D(�A0�D(C BBB�a��(�a���A�D�J �
CAH(�a���dA�D�D g
CAD�a��Hb���A�A�D X
CAFT
CAHI
CAKKACLbp���a�O
HFlb���;A�m
BF�b
��;A�m
BF �b 
���A�G ]
AJ4�b�
���A�I0]
AH�
AA�
AFc��
c��$0c��EA�N b
CDKA4XcD��\B�D�A �f
ABHK
EBF�cl��K\n�c����c���DQ�c���DNH�c����B�E�E �D(�A0��
(A BBBEF(A DBBH<d@���B�E�B �B(�D0�A8�DPt
8C0A(B BBBD@�d���&B�D�D �D0�
 CABD@
 CABJ�d���;D n�d���ND v
FK@e��nB�D�D �D0}
 DABFE
 DABDHHeD��B�B�B �E(�D0�I8�F@�
8D0A(B BBBG4�e��LB�D�I �a
GBGFAD�e0��)�eL��V$�e����U�A�xBA��fP��0fL��FDf����w�tE�H`f<��JB�E�E �B(�A0�D8�G@�
8C0A(B BBBJX�f@���B�H�D �D(�D0�
(A ABBGD
(C ABBDK(A ABB<g����G�B�G �D(�K0R(C ABBG����0Hg4��;A�P
F�E�E�D��
Hj|g@��-A�[
DL�gP��`�gL���B�E�E �E(�A0�C8�DP�
8C0A(B BBBDa
8A0A(B BBBEh���(h���<h���Ph|��dh���	|h���-A�[
DL�h���	�h����h���+�h����h���`i����B�E�E �E(�D0�A8�DP�
8C0A(B BBBGI
8A0A(B BBBEdi8!��xi4!���i0!���i(!��(�i4"��2T�E��
AFN��L�iH#��tB�E�B �B(�D0�D8�J��
8A0A(B BBBH\4jx&���B�B�B �A(�A0��
(A BBBEN
(A BBBKN(A BBBH�j'���B�H�H �A(�O0O
(C ABBG�(A CBB0�j�'��kA�A�G w
CAD\CC,k�'��RB�D�A �G� AABDk(��J<XkT(���K�E�E �D(�A0��(A BBBH�����,�k)��]B�D�D �G0G AAB(�kD)��^B�A�D �OABD�kx*���B�B�B �B(�A0�A8�D@p8A0A(B BBB4<l�*��ZB�G�A �A(�G0~(D ABBdtl�*���B�B�B �B(�A0�D8�D@0
8A0A(B BBBE0
8A0A(B BBBF�l@-��&JK�lX-��&JKmp-�� ml-��4mx-��Lm�-��9@`m�-��0B�L�H �B(�A0�E8�0A(B BBBp�m�/��[K�B�A �D(�D0w
(A ABBE�����H0����j
(A ABBHT
(A ABBF,n�1���B�A�A ��
ABI4HnD3���A�A�D@m
EAAp
CAA8�n�3��BB�E�D �D(�D�h(A ABB�n�3���n�3��	�n�3��	(�n�3��YA�I�D EDA$$o4��UA�n
AP
HHLoP4��8KaHdox4���B�F�E �E(�A0�D8�DPZ
8C0A(B BBBG�o6���o6���o6���o6��Lp6��dB�B�A �A(�DPX
(C ABBF�
(H ABBGPp<7��$dp87��+A�A�G ]CA�p@7���p<7��4�p87��^J�G�L T
AAEZAAD���p`7��q\7��qX7��,,qP7���A�A�D0s
CAC\q�7��NDItq�7��GA�{�q,8��GA�}$�q`8��`A�D�O IAAD�q�8��B�D�C �y
ABKB
ABKh
ABEHrp9���A�D�G A
DANo
AAG\
HAKdAAHhr$:���A�D�G A
DANo
AAG\
HAKdAAH�r�:���A�D�G A
DANo
AAG\
HAKdAAs�;��A�Ts�;��0s�;��$Ds�;��NA�a
FF
JUls�;���s�;���s�;��0�s�;��MA�N [
AEK
ADKA�s�;��A�[L�s�;���B�E�E �B(�D0�D8�G��
8C0A(B BBBETHt4C���B�E�E �A(�D0�D@�
0A(A BBBDW
0A(A BBBA�t�C���t�C��G8�t�C��MB�E�D �I(�G0i(C ABB$u�C���A��
Cb
F,u�D��wA�qHu4E��.DT
HK(huDE��XA�C�G�GDA�uxE���utE��0�u�E��uB�D�A �G�` CAB�u�E��-A�D�fA$v�E��6A�C�G�hAA(8v�E��9A�C�G�kAAdvF��xvF��	0�vF��aA�D�O0]
AAEfAA�v<F���vHF��&D \�v`F��	w\F��	\wXF���B�E�E �D(�I0�m
(A BBBCG
(H BFBGA(F BBBtw�F���w�F��	�w�F��D$�w�F��.A�D�G0_AA�w�F���w�F��x�F��x�F��(x�F��
8<x�F��fG�D�D �R
ABDmABH���xx�F��A�\�x�F���x�F��(�x�F��8B�G�I �^AB�x�F��A�Qy�F��y�F��,y�F��@y�F��Ty�F��8hy�F��fG�D�D �T
ABJcABJ����yG��
�yG�� D [$�yG���A�V�Op[CA�y�G��z�G���N�Q`^C,z�G���$@z�H��*A�D�G [AAhz�H��L|zI��C�zLI���zXI��B�z�I��JG B�z�I���z�I�� �z�I���A�G@�A  {LK���A�G@�AD{�L��eA�QPOC<d{M��sB�I�F �G�@z
 CABHG HAB$�{XM��OA�R�@n
AF0�{�M��gB�I�G �G�z
 CABG$|�M��$A�D�G SCA((|�M��WA�L�J�t
AAC<T|�M��sB�I�F �G�z
 CABHG HAB@����#)�0�����H��P�@�`����pP�� �`����@���`�@�����p������P���0�`�������`�P�����`�p��� �#0�P��0����`�#����������P�p���p���� ���0�P�p������5�5�56696(�
D���#��#���o��`�
�6�#�%x����		���o�����o�oL����oUP�#f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v�������������������&�6�F�V�f�v� ��#�# �#����GA$3a1(�Q�libapr-1.so.0.7.6-1.7.6-1.el8.cloudlinux.x86_64.debug��C�7zXZ�ִF!t/��_��]?�E�h=��ڊ�2N��\^ ��Doة�_�K���+:���(�0���BG1��Q�$�C�R�Y�Ծ��[���F?����Z�A�T�p4��	�*Ϲ��Um7��yb^��3'RC^��9�꧙���G�x�,��CO���Xd�Sh.�0�?��X��b\۞M2b6-��&�cOYs�:�����.!�`�-�2̢gQD����\h�_�H
�I�	�0|ޠDU�!�o��-?c9��B/HH;�A���S�S�,��ŭZV�����j8HC�|�hW�[��zp�"����۹�[^g��Z�����n[�fHH�hSQҟ���<�k��'y�R�d�r��~��*���dܺf��&�jّdU�������k�����}�;/�����!G�u�D��re�k�(�2`:1�$Nqo��|���%��	� Seo���ɀA�F�/��0.���]u�f��X��2uD��W���f�����~�s�[��5�v���R-^
@q����Ł���J�noӬٳ��V��v�.���E�i}�XA�g@�d�1�6V��m��N��ˁ�u�ܼ̪���q��:7��R�ì�f��h�%s �*�����Q���N�����É���M~"�lG���.�<��
�&��7Dϰ#L7��ĺrџ7�8c,ɱ�5�����
���S�݇�]BF���B��7"�fy���`��+�JR�yZ����c-�4��R�S��rc�D��е���k�AzeM$`��6Z�䋪bP<�
�w��y-�ƙi�Ve�ʙV��ֿ [>ZQb�Ou�b-����* �	�{W1�4P��eV���w@b�d�����&��/�P�����~��u��UO�V�#����&o�O���̞����g�[N�w�&	`�cՏo���74���I#hsBZp�����W���S!�=�n���� p�8AL����e�"�
�G�ޑ��$8�Q>el�M
��wm�|��.�E�Y���O,#zp�?W�A�V#h1� �+�j���*~=��&��EɂZf&fg�p��5=�f��"��ԉ4�{�㭱��3�ʂU��?��u�pA{@�搵�'�I���bv菢r��_�S��s���t���Xb���.]�.W�ⴂzڷ���p��wQ���2|7�Y‡5_�Y���V���*5���S�o&�'�'��	�7������ώ�|��%��r���5QYܚ� ;+�4��\���dA?�Y/���ڋjv^W��{�H�pa�����y�λ]Ql�6�ı��sR}�#2y�:c/;��9��8T+����qL&2�~!�.�Fl��B7Ĝr��%�h�3�2�
������s�� ����yL�ɹB&�KN�����y��C����_�o��yB��HV��ɍ��H��Sb�q��e��o4��K����g�&aX��F��br7�_�r��e7 �l�i�[K|<���_���h��iݐ���P�Z��ս��}�g|�2M�(�k�L�ﷶoi[�N*X!�o��Z�ͺ^�K3͝������r�D�cM�Q������[��ى3�…�V�Ȣ/�!�������̼��sl�#l/�Y���Un��C�c��c�i="���mH�9�4��y�G��77�j��<Q���>�p�(2-�O�)*�t9��6lY">�o�I���6�q�>}��6��i|�0J��c�t�Y߿�;�G�Y1n��~.�\"ТX�W�`�*l'6�����#�EQ�#`*�Qd�c�y���-�b�|F.')
�%l怕y��v��D�G܌'Y//]����aB�\��r}4P��@��;�ODdol÷xS��� �Yy��0d(ΠHtYv���M����\��1�
�>����I"]:�c��r��i�1a
�ܽ�<j�ex��;r�� ��T+�p���B�7�8V�%|�O]s�^��
3�	�l�LvݟdԎ~���Z6<r��Α-u]�a�匲C�۳�}%�W�������/�v0~s�Ͱd_ݩ��EN׬y����k_>����^��ehMkR�)vi�q�
�|�Ew�%mF��É�l��Ą\
��[Ѽ_
#St��si� i��o���W�
x�{��X��b݀�S�PmJ�>RP
_��	3�+�Sd	3����	�rE{�V:�vDƜ�P♗��R�M�XϦ@��H$&�&���*y���M��sSOΡd�5Ҿ?}�<ß�<��@�p�7�,��q�c��rG<��j��Ë� �
B�,�>
~΁�4��Z�e�f��F��+��歷F����CT} ���,/��=�C����Y�XNbxI��v��ĩB�_ߺÖ ;�T��WU�־��)����a�~��؃�ݢ����RV0� �k�(R&��xGz�c��33	�‘9d˺��C� �X�n&��n����>��)��;��c�e�E�/�l�7�,��kMg�]w�2̅�#��x���]�C�}�jxn���9�qr�↊_���v|D%>��O�Gy��_�i���kt��\O|���U*����*I�r�-zm�y�8���#�ӥwd���丯ҷ%ʝ��$+�8��pX��?�e�G��C�.�ZNF��l��i@:�<{�bl�V����ڸ`�`��6�u�ʐ9@g|��s|�7Js@��?y��?��–x�'"Q��{����o
��;]�M�
{�XO�ښ˫^��s��dK��P���\44��7�_
��`;i��a�x^��S��k�4!���ͥs���E�f�I�~����ܶU:����O���C�Q�?ҀCp�-�>�668h��%)�=T�5������S8aMO$L����8�Y��nw>��ET����4My�M5�{0���^[R�i�W_�r��cU˝́����o
�<���|�#?:\j����V���&u'���X�		 �g/���Vs!���7[��J����7�����Kȍ�ty���s�1y���R�،"�<�)���p;<�j6A��{X�J��K1��g.+�h�{��dl8�
�Oe���s
q`����<m���hӪe�7�ny	�.,-PR˼g��]f���0�h]�	�!�҆��;ga�~Xk?��N�?
Y@�S:<���}f�OVLYB<�L0�����9�K}��D�悧]�D�&q���/՗�s_�o1��r]�}�$ץZ��^��?"UV��ia!��g�tY�� �+4уz���5��]���@iP|c�$@ꃦ����p[o���C:6]v%��흄�M��P0���~T�=E�r��(�a۪i�q�η�x�4�R�5�H:�Oї_\�6�$����Eg�p����3i�aj�h�hF����c��H�S1���f��D"8�4��T��,���2X8/���B�k���jTW)蝃&\`�gB��ڎ�m`�dè�g��9m�b��{K����*GO?ѓ�uz5�k$�,��:�*�@��O����ޙ�޵2�i�^�zp�X�~��L,	���[�R�x*�����ѫ���f(���4����,�7�!G7p��t㳞�p��u�h�jh�ҞU���3;��g-~$�Պ�����B�I�W!��6�y_�U;�5$,?S|��y�=ڌ�&n+O���+�!4{�V����9X�n�H�Oߤ�d�^Q�K������y<�9�{����0D����Z�=Au�e�%��3�(aG����C���5�p��b���u�	˥�I�q@�i��0��$I�����s��L.��y�a����̵��nʔ�>75��l��v�!�x�ޗv(߫xɳ����f�p�1@���;l�Y��L����U�_y�2ɞ�GU��L�l�Y{�v�Fm���9w,�nVx�_8�k�΁~��;"D��OT��K�Wqs-}�ZCK]ˍ�N�O���G߯����՟��{Λ��)�h���3�e��H<Q+Y�G�}��88���њ
��oL�9�
�e�Q$~�D�~��3Q}���n��S�?�cG!Jvx�9B`.�uW��V	I���y��
�͇��uM�x;��[z-�_�ݫ�#���U@��%%?\�Y��,�uw��%X����k�,N^N�۷7���2{��y��f��}��gp�,���L>��4L����rd��*��e��0X� �4�c���M_�L��ݢt��]��m164���#
&�&,[�ӭ�&})t��$$��B����B g�������;C�M���/��Y.KW2����C��>Gh�Y��]x��t���PZ��[��xЯ��-��z�oYb`
��I��cR�u�����=�9s�YȔ)�l�5�M C�0����U�]m�]dw��#��DǶl�_5}%�E3�����S�xWi�p�k�x���O�h�F[�����1@��/1���§=�
R��'�?B[�8c���aBYٶ��ךk���0���+����À"�\�g�|�}v�� S���V���}G���Q�ތ�k�E�g�y�U���O�j�:v�WȚ�0�.;�3]�Ā�\��41�����i�D0s&�)�V�p���un-���t���=�m*ϋ�]U���]��#��F�~�y��9\�8�v�]b���N�_Od���\�9��>��n�/�ɟw
��
����0{�"��+Ey�PL��f��)��Z
�p�D P�BUsOnp�†�䕇s!������#'^�FY����p��k�ε��!��E�IG������&��9v�#n5x�6�l	�CH|m�B*G�u�L����1��1T��J��2��_�!��ҟ%*�)�١&uǶ���{��������b%�$����o6��ղw�,ml�E^Q�Ѧ2$�9b�q6��2d>�Ng?i�3(X���-�*I$ڍ�a����mTՓ<s��iO-���m'�Ǩ�s/�-�_�����_N�b�������x�����f_5��U.�QⲒV�%e��e:�����	0��}MN�&(ے�"ÕI5���ml�X�}j��>��~b4l��)�W���#���1���t��,�Bs��xrRpRI��^Kx���C���-ðM�����^J��ð��{��Ҹ9n����G\g�
�HRY�G�������j����C�	�V�?N�p���pY0���~;3���M�� op P�Z��h�)�r����q�JM�l)A�������e�w?�OK0l�Yfdj���1-a��&A���AǛ�F��m����"X2..�c��(കWq\�f�%j�a�¥tM����-?w)�A�}(Ѝ���u��=R ��.��z�\T�y����l�_���f���y��ue���!A�	k�Q��sࣻnx#|j�ɹ|�4����MQ�B>Ĥb�t]Nj�IJ�F��֘������>-�g���𘕽;��X�C��Vu��2pG�2�SE6��jndW��\���\��&z�o�MI׊�����BD�V�bC�No�<7�Q�s���:�A�ה��@���c�?w�`X�h�_�?��A���0�G�a�GI[�F
W��v;Z�h䜩��J�ʁ�HK�.�	�;,f��)E 9('�	j��-��	���g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.got.plt.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata��$���o���(��K0�`�`�68���oL�L�BE���o����T�����	^Bx�x��%h(�(�cP�P�0n������tD�D�
z`�`�p ��������|���#�����#�����#��� �P�#P��`�#`����#�����#��� �`�#X�� ��cX�$�|�<����lib64/apr-1/build/make_exports.awk000075500000005657150336140420012726 0ustar00
BEGIN {
    printf("/*\n")
    printf(" * THIS FILE WAS AUTOGENERATED BY make_exports.awk\n")
    printf(" *\n")
    printf(" * This is an ugly hack that needs to be here, so\n")
    printf(" * that libtool will link all of the APR functions\n")
    printf(" * into server regardless of whether the base server\n")
    printf(" * uses them.\n")
    printf(" */\n")
    printf("\n")
    printf("#define CORE_PRIVATE\n")
    printf("\n")
    
    for (i = 1; i < ARGC; i++) {
        file = ARGV[i]
        sub("([^/]*[/])*", "", file)
        printf("#include \"%s\"\n", file)
    }

    printf("\n")
    printf("const void *ap_ugly_hack = NULL;\n")
    printf("\n")
    
    TYPE_NORMAL = 0
    TYPE_HEADER = 1

    stackptr = 0
}

function push(line) {
    stack[stackptr] = line
    stackptr++
}

function do_output() {
    printf("/*\n")
    printf(" * %s\n", FILENAME)
    printf(" */\n")
    
    for (i = 0; i < stackptr; i++) {
        printf("%s\n", stack[i])
    }
    
    stackptr = 0

    printf("\n");
}

function enter_scope(type) {
    scope++
    scope_type[scope] = type
    scope_stack[scope] = stackptr
    delete scope_used[scope]
}

function leave_scope() {
    used = scope_used[scope]
   
    if (!used)
        stackptr = scope_stack[scope]

    scope--
    if (used) {
        scope_used[scope] = 1
        
        if (!scope)
            do_output()
    }
}

function add_symbol(symbol) {
    if (!index(symbol, "#")) {
        push("const void *ap_hack_" symbol " = (const void *)" symbol ";")
        scope_used[scope] = 1
    }
}

/^[ \t]*AP[RUI]?_(CORE_)?DECLARE[^(]*[(][^)]*[)]([^ ]* )*[^(]+[(]/ {
    sub("[ \t]*AP[RUI]?_(CORE_)?DECLARE[^(]*[(][^)]*[)][ \t]*", "")
    sub("[(].*", "")
    sub("([^ ]* (^([ \t]*[(])))+", "")

    add_symbol($0)
    next
}

/^[ \t]*AP_DECLARE_HOOK[^(]*[(][^)]*/ {
    split($0, args, ",")
    symbol = args[2]
    sub("^[ \t]+", "", symbol)
    sub("[ \t]+$", "", symbol)

    add_symbol("ap_hook_" symbol)
    add_symbol("ap_hook_get_" symbol)
    add_symbol("ap_run_" symbol)
    next
}

/^[ \t]*APR_POOL_DECLARE_ACCESSOR[^(]*[(][^)]*[)]/ {
    sub("[ \t]*APR_POOL_DECLARE_ACCESSOR[^(]*[(]", "", $0)
    sub("[)].*$", "", $0)
    add_symbol("apr_" $0 "_pool_get")
    next
}

/^[ \t]*APR_DECLARE_INHERIT_SET[^(]*[(][^)]*[)]/ {
    sub("[ \t]*APR_DECLARE_INHERIT_SET[^(]*[(]", "", $0)
    sub("[)].*$", "", $0)
    add_symbol("apr_" $0 "_inherit_set")
    next
}

/^[ \t]*APR_DECLARE_INHERIT_UNSET[^(]*[(][^)]*[)]/ {
    sub("[ \t]*APR_DECLARE_INHERIT_UNSET[^(]*[(]", "", $0)
    sub("[)].*$", "", $0)
    add_symbol("apr_" $0 "_inherit_unset")
    next
}

/^#[ \t]*if(ndef| !defined[(])([^_]*_)*H/ {
    enter_scope(TYPE_HEADER)
    next
}

/^#[ \t]*if([n]?def)? / {
    enter_scope(TYPE_NORMAL)
    push($0)
    next
}

/^#[ \t]*endif/ {
    if (scope_type[scope] == TYPE_NORMAL)
        push($0)
        
    leave_scope()
    next
}

/^#[ \t]*else/ {
    push($0)
    next
}

/^#[ \t]*elif/ {
    push($0)
    next
}


lib64/apr-1/build/mkdir.sh000075500000002262150336140420011150 0ustar00#!/bin/sh
## 
##  mkdir.sh -- make directory hierarchy
##
##  Based on `mkinstalldirs' from Noah Friedman <friedman@prep.ai.mit.edu>
##  as of 1994-03-25, which was placed in the Public Domain.
##  Cleaned up for Apache's Autoconf-style Interface (APACI)
##  by Ralf S. Engelschall <rse@apache.org>
##
#
# This script falls under the Apache License.
# See http://www.apache.org/docs/LICENSE


umask 022
errstatus=0
for file in ${1+"$@"} ; do 
    set fnord `echo ":$file" |\
               sed -e 's/^:\//%/' -e 's/^://' -e 's/\// /g' -e 's/^%/\//'`
    shift
    pathcomp=
    for d in ${1+"$@"}; do
        pathcomp="$pathcomp$d"
        case "$pathcomp" in
            -* ) pathcomp=./$pathcomp ;;
            ?: ) pathcomp="$pathcomp/" 
                 continue ;;
        esac
        if test ! -d "$pathcomp"; then
            thiserrstatus=0
            mkdir "$pathcomp" || thiserrstatus=$?
            # ignore errors due to races if a parallel mkdir.sh already
            # created the dir
            if test $thiserrstatus != 0 && test ! -d "$pathcomp" ; then
                errstatus=$thiserrstatus
            fi
        fi
        pathcomp="$pathcomp/"
    done
done
exit $errstatus

lib64/apr-1/build/apr_rules.mk000075500000014270150336140420012035 0ustar00# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#

#
# rules.mk: standard rules for APR
#



#
# Configuration variables
#
apr_builddir=/opt/cpanel/ea-apr16/lib64/apr-1/build
apr_builders=/opt/cpanel/ea-apr16/lib64/apr-1/build
top_builddir=/opt/cpanel/ea-apr16/lib64/apr-1/build

# Some layouts require knowing what version we are at.
APR_MAJOR_VERSION=1
APR_DOTTED_VERSION=1.7.6

CC=gcc
CC_FOR_BUILD=gcc
RM=rm
AWK=gawk
SHELL=/bin/sh
LIBTOOL=$(SHELL) $(apr_builddir)/libtool

# compilation and linking flags that are supposed to be set only by the user.
# configure adds to them for tests, but we restore them at the end.
#
CFLAGS=
CPPFLAGS=
LDFLAGS=
LIBS=
DEFS=-DHAVE_CONFIG_H

# anything added to the standard flags by configure is moved to EXTRA_*
# at the end of the process.
#
EXTRA_CFLAGS=-g -O2 -pthread
EXTRA_CPPFLAGS=-DLINUX -D_REENTRANT -D_GNU_SOURCE
EXTRA_LDFLAGS=
EXTRA_LIBS=-luuid -lcrypt  -lpthread -ldl
EXTRA_INCLUDES=

# CPPFLAGS which are used only while building APR itself
#
INTERNAL_CPPFLAGS=

# NOTEST_* are flags and libraries that can be added by the user without
# causing them to be used in configure tests (necessary for things like
# -Werror and other strict warnings that maintainers like to use).
#
NOTEST_CFLAGS=
NOTEST_CPPFLAGS=
NOTEST_LDFLAGS=
NOTEST_LIBS=

# Finally, combine all of the flags together in the proper order so that
# the user-defined flags can always override the configure ones, if needed.
# Note that includes are listed after the flags because -I options have
# left-to-right precedence and CPPFLAGS may include user-defined overrides.
#
ALL_CFLAGS   = $(EXTRA_CFLAGS) $(NOTEST_CFLAGS) $(CFLAGS)
ALL_CPPFLAGS = $(DEFS) $(INTERNAL_CPPFLAGS) $(EXTRA_CPPFLAGS) $(NOTEST_CPPFLAGS) $(CPPFLAGS)
ALL_LDFLAGS  = $(EXTRA_LDFLAGS) $(NOTEST_LDFLAGS) $(LDFLAGS)
ALL_LIBS     = $(LIBS) $(NOTEST_LIBS) $(EXTRA_LIBS)
ALL_INCLUDES = $(INCLUDES) $(EXTRA_INCLUDES)

LTFLAGS      = --silent
LT_LDFLAGS   = 

# The set of object files that will be linked into the target library.
# The build-outputs.mk specifies a different set for each platform. The
# configure script will select the appropriate set.
#
OBJECTS      = $(OBJECTS_unix)

#
# Basic macro setup
#
COMPILE      = $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES)
LT_COMPILE   = $(LIBTOOL) $(LTFLAGS) --mode=compile --tag=CC $(COMPILE) -o $@ -c $< && touch $@

LINK         = $(LIBTOOL) $(LTFLAGS) --mode=link --tag=CC $(COMPILE) $(LT_LDFLAGS) $(LT_VERSION) $(ALL_LDFLAGS) -o $@

APR_MKDIR        = $(apr_builders)/mkdir.sh
APR_MKEXPORT     = $(AWK) -f $(apr_builders)/make_exports.awk
APR_MKVAREXPORT  = $(AWK) -f $(apr_builders)/make_var_export.awk
MKDEP            = $(CC) -MM

#
# Standard build rules
#
all: all-recursive
depend: depend-recursive
clean: clean-recursive
distclean: distclean-recursive
extraclean: extraclean-recursive

install: all-recursive


all-recursive depend-recursive:
	@otarget=`echo $@ | sed s/-recursive//`; \
	list='$(SOURCE_DIRS)'; \
	for i in $$list; do \
	    if test -f "$$i/Makefile"; then \
		target="$$otarget"; \
		echo "Making $$target in $$i"; \
		if test "$$i" = "."; then \
		    made_local=yes; \
		    target="local-$$target"; \
		fi; \
		(cd $$i && $(MAKE) $$target) || exit 1; \
	    fi; \
	done; \
        if test "$$otarget" = "all" && test -z "$(TARGETS)"; then \
	    made_local=yes; \
	fi; \
	if test "$$made_local" != "yes"; then \
	    $(MAKE) "local-$$otarget" || exit 1; \
	fi

clean-recursive distclean-recursive extraclean-recursive:
	@otarget=`echo $@ | sed s/-recursive//`; \
	list='$(CLEAN_SUBDIRS)'; \
	for i in $$list; do \
	    if test -f "$$i/Makefile"; then \
		target="$$otarget"; \
		echo "Making $$target in $$i"; \
		if test "$$i" = "."; then \
		    made_local=yes; \
		    target="local-$$target"; \
		fi; \
		(cd $$i && $(MAKE) $$target); \
	    fi; \
	done; \
        if test "$$otarget" = "all" && test -z "$(TARGETS)"; then \
	    made_local=yes; \
	fi; \
	if test "$$made_local" != "yes"; then \
	    $(MAKE) "local-$$otarget"; \
	fi

# autoconf 2.5x is creating a 'autom4te.cache' directory
# In case someone ran autoconf by hand, get rid of that directory
# as well.
local-clean: x-local-clean
	@list='. $(SOURCE_DIRS)'; \
	for i in $$list; do \
	    echo $(RM) -f $$i/*.o $$i/*.lo $$i/*.a $$i/*.la $$i/*.so $$i/*.obj; \
	    $(RM) -f $$i/*.o $$i/*.lo $$i/*.a $$i/*.la $$i/*.so $$i/*.obj; \
	    echo $(RM) -rf $$i/.libs; \
	    $(RM) -rf $$i/.libs; \
        done
	$(RM) -f $(CLEAN_TARGETS) $(PROGRAMS)
	$(RM) -rf autom4te.cache

local-distclean: local-clean x-local-distclean
	$(RM) -f Makefile $(DISTCLEAN_TARGETS)

local-extraclean: local-distclean x-local-extraclean
	@if test -n "$(EXTRACLEAN_TARGETS)"; then \
	    echo $(RM) -f $(EXTRACLEAN_TARGETS) ; \
	    $(RM) -f $(EXTRACLEAN_TARGETS) ; \
	fi

local-all: $(TARGETS)

local-depend: x-local-depend
	@if test -n "`ls $(srcdir)/*.c 2> /dev/null`"; then \
		$(RM) -f .deps; \
		list='$(srcdir)/*.c'; \
		for i in $$list; do \
			$(MKDEP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) $$i | sed 's/\.o:/.lo:/' >> .deps; \
		done; \
	fi

# to be filled in by the actual Makefile
x-local-depend x-local-clean x-local-distclean x-local-extraclean:

#
# Implicit rules for creating outputs from input files
#
.SUFFIXES:
.SUFFIXES: .c .lo .o

.c.o:
	$(COMPILE) -c $<

.c.lo:
	$(LT_COMPILE)

.PHONY: all all-recursive local-all install \
	depend depend-recursive local-depend x-local-depend \
	clean clean-recursive local-clean x-local-clean \
	distclean distclean-recursive local-distclean x-local-distclean \
	extraclean extraclean-recursive local-extraclean x-local-extraclean
lib64/apr-1/build/make_var_export.awk000075500000001777150336140420013412 0ustar00# Based on apr's make_export.awk, which is
# based on Ryan Bloom's make_export.pl

/^#[ \t]*if(def)? (AP[RUI]?_|!?defined).*/ {
	if (old_filename != FILENAME) {
		if (old_filename != "") printf("%s", line)
		macro_no = 0
		found = 0
		count = 0
		old_filename = FILENAME
		line = ""
	}
	macro_stack[macro_no++] = macro
	macro = substr($0, length($1)+2)
	count++
	line = line "#ifdef " macro "\n"
	next
}

/^#[ \t]*endif/ {
	if (count > 0) {
		count--
		line = line "#endif /* " macro " */\n"
		macro = macro_stack[--macro_no]
	}
	if (count == 0) {
		if (found != 0) {
			printf("%s", line)
		}
		line = ""
	}
	next
}

function add_symbol (sym_name) {
	if (count) {
		found++
	}
	for (i = 0; i < count; i++) {
		line = line "\t"
	}
	line = line sym_name "\n"

	if (count == 0) {
		printf("%s", line)
		line = ""
	}
}

/^[ \t]*(extern[ \t]+)?AP[RUI]?_DECLARE_DATA .*;$/ {
       varname = $NF;
       gsub( /[*;]/, "", varname);
       gsub( /\[.*\]/, "", varname);
       add_symbol(varname);
}

END {
	printf("%s", line)
}
lib64/apr-1/build/libtool000075500001226252150336140420011105 0ustar00#! /bin/sh
# Generated automatically by config.status () 
# Libtool was configured on host buildfarm03-new.corp.cloudlinux.com:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.

# Provide generalized library-building support services.
# Written by Gordon Matzigkeit, 1996

# Copyright (C) 2014 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# GNU Libtool is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of of the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program or library that is built
# using GNU Libtool, you may include this file under the  same
# distribution terms that you use for the rest of that program.
#
# GNU Libtool is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


# The names of the tagged configurations supported by this script.
available_tags=''

# Configured defaults for sys_lib_dlsearch_path munging.
: ${LT_SYS_LIBRARY_PATH=""}

# ### BEGIN LIBTOOL CONFIG

# Assembler program.
AS="as"

# DLL creation program.
DLLTOOL="dlltool"

# Object dumper program.
OBJDUMP="objdump"

# Which release of libtool.m4 was used?
macro_version=2.4.6
macro_revision=2.4.6

# Whether or not to build shared libraries.
build_libtool_libs=yes

# Whether or not to build static libraries.
build_old_libs=yes

# What type of objects to build.
pic_mode=default

# Whether or not to optimize for fast installation.
fast_install=yes

# Shared archive member basename,for filename based shared library versioning on AIX.
shared_archive_member_spec=

# Shell to use when invoking shell scripts.
SHELL="/bin/sh"

# An echo program that protects backslashes.
ECHO="printf %s\\n"

# The PATH separator for the build system.
PATH_SEPARATOR=":"

# The host system.
host_alias=
host=x86_64-pc-linux-gnu
host_os=linux-gnu

# The build system.
build_alias=
build=x86_64-pc-linux-gnu
build_os=linux-gnu

# A sed program that does not truncate output.
SED="/usr/bin/sed"

# Sed that helps us avoid accidentally triggering echo(1) options like -n.
Xsed="$SED -e 1s/^X//"

# A grep program that handles long lines.
GREP="/usr/bin/grep"

# An ERE matcher.
EGREP="/usr/bin/grep -E"

# A literal string matcher.
FGREP="/usr/bin/grep -F"

# A BSD- or MS-compatible name lister.
NM="/usr/bin/nm -B"

# Whether we need soft or hard links.
LN_S="ln -s"

# What is the maximum length of a command?
max_cmd_len=1572864

# Object file suffix (normally "o").
objext=o

# Executable file suffix (normally "").
exeext=

# whether the shell understands "unset".
lt_unset=unset

# turn spaces into newlines.
SP2NL="tr \\040 \\012"

# turn newlines into spaces.
NL2SP="tr \\015\\012 \\040\\040"

# convert $build file names to $host format.
to_host_file_cmd=func_convert_file_noop

# convert $build files to toolchain format.
to_tool_file_cmd=func_convert_file_noop

# Method to check whether dependent libraries are shared objects.
deplibs_check_method="pass_all"

# Command to use when deplibs_check_method = "file_magic".
file_magic_cmd="\$MAGIC_CMD"

# How to find potential files when deplibs_check_method = "file_magic".
file_magic_glob=""

# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
want_nocaseglob="no"

# Command to associate shared and link libraries.
sharedlib_from_linklib_cmd="printf %s\\n"

# The archiver.
AR="ar"

# Flags to create an archive.
AR_FLAGS="cru"

# How to feed a file listing to the archiver.
archiver_list_spec="@"

# A symbol stripping program.
STRIP="strip"

# Commands used to install an old-style archive.
RANLIB="ranlib"
old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$tool_oldlib"
old_postuninstall_cmds=""

# Whether to use a lock for old archive extraction.
lock_old_archive_extraction=no

# A C compiler.
LTCC="gcc"

# LTCC compiler flags.
LTCFLAGS=""

# Take the output of nm and produce a listing of raw symbols and C names.
global_symbol_pipe="sed -n -e 's/^.*[	 ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[	 ][	 ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p' | sed '/ __gnu_lto/d'"

# Transform the output of nm in a proper C declaration.
global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p'"

# Transform the output of nm into a list of symbols to manually relocate.
global_symbol_to_import=""

# Transform the output of nm in a C name address pair.
global_symbol_to_c_name_address="sed -n -e 's/^: \\(.*\\) .*\$/  {\"\\1\", (void *) 0},/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(.*\\)\$/  {\"\\1\", (void *) \\&\\1},/p'"

# Transform the output of nm in a C name address pair when lib prefix is needed.
global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\(.*\\) .*\$/  {\"\\1\", (void *) 0},/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(lib.*\\)\$/  {\"\\1\", (void *) \\&\\1},/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(.*\\)\$/  {\"lib\\1\", (void *) \\&\\1},/p'"

# The name lister interface.
nm_interface="BSD nm"

# Specify filename containing input files for $NM.
nm_file_list_spec="@"

# The root where to search for dependent libraries,and where our libraries should be installed.
lt_sysroot=

# Command to truncate a binary pipe.
lt_truncate_bin="/usr/bin/dd bs=4096 count=1"

# The name of the directory that contains temporary libtool files.
objdir=.libs

# Used to examine libraries when file_magic_cmd begins with "file".
MAGIC_CMD=file

# Must we lock files when doing compilation?
need_locks="no"

# Manifest tool.
MANIFEST_TOOL=":"

# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
DSYMUTIL=""

# Tool to change global to local symbols on Mac OS X.
NMEDIT=""

# Tool to manipulate fat objects and archives on Mac OS X.
LIPO=""

# ldd/readelf like tool for Mach-O binaries on Mac OS X.
OTOOL=""

# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
OTOOL64=""

# Old archive suffix (normally "a").
libext=a

# Shared library suffix (normally ".so").
shrext_cmds=".so"

# The commands to extract the exported symbol list from a shared archive.
extract_expsyms_cmds=""

# Variables whose values should be saved in libtool wrapper scripts and
# restored at link time.
variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"

# Do we need the "lib" prefix for modules?
need_lib_prefix=no

# Do we need a version for libraries?
need_version=no

# Library versioning type.
version_type=linux

# Shared library runtime path variable.
runpath_var=LD_RUN_PATH

# Shared library path variable.
shlibpath_var=LD_LIBRARY_PATH

# Is shlibpath searched before the hard-coded library search path?
shlibpath_overrides_runpath=no

# Format of library name prefix.
libname_spec="lib\$name"

# List of archive names.  First name is the real one, the rest are links.
# The last name is the one that the linker finds with -lNAME
library_names_spec="\$libname\$release\$shared_ext\$versuffix \$libname\$release\$shared_ext\$major \$libname\$shared_ext"

# The coded name of the library, if different from the real name.
soname_spec="\$libname\$release\$shared_ext\$major"

# Permission mode override for installation of shared libraries.
install_override_mode=""

# Command to use after installation of a shared archive.
postinstall_cmds=""

# Command to use after uninstallation of a shared archive.
postuninstall_cmds=""

# Commands used to finish a libtool library installation in a directory.
finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir"

# As "finish_cmds", except a single script fragment to be evaled but
# not shown.
finish_eval=""

# Whether we should hardcode library paths into libraries.
hardcode_into_libs=yes

# Compile-time system search path for libraries.
sys_lib_search_path_spec="/usr/lib/gcc/x86_64-redhat-linux/8 /usr/lib64 /lib64 /usr/lib /lib "

# Detected run-time system search path for libraries.
sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib "

# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
configure_time_lt_sys_library_path=""

# Whether dlopen is supported.
dlopen_support=unknown

# Whether dlopen of programs is supported.
dlopen_self=unknown

# Whether dlopen of statically linked programs is supported.
dlopen_self_static=unknown

# Commands to strip libraries.
old_striplib="strip --strip-debug"
striplib="strip --strip-unneeded"


# The linker used to build libraries.
LD="/usr/bin/ld -m elf_x86_64"

# How to create reloadable object files.
reload_flag=" -r"
reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs"

# Commands used to build an old-style archive.
old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib"

# A language specific compiler.
CC="gcc"

# Is the compiler the GNU compiler?
with_gcc=yes

# Compiler flag to turn off builtin functions.
no_builtin_flag=" -fno-builtin"

# Additional compiler flags for building library objects.
pic_flag=" -fPIC -DPIC"

# How to pass a linker flag through the compiler.
wl="-Wl,"

# Compiler flag to prevent dynamic linking.
link_static_flag=""

# Does compiler simultaneously support -c and -o options?
compiler_c_o="yes"

# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=no

# Whether or not to disallow shared libs when runtime libs are static.
allow_libtool_libs_with_static_runtimes=no

# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec="\$wl--export-dynamic"

# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec="\$wl--whole-archive\$convenience \$wl--no-whole-archive"

# Whether the compiler copes with passing no objects directly.
compiler_needs_object="no"

# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=""

# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=""

# Commands used to build a shared archive.
archive_cmds="\$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \$wl-soname \$wl\$soname -o \$lib"
archive_expsym_cmds="echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~
            cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~
            echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~
            \$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \$wl-soname \$wl\$soname \$wl-version-script \$wl\$output_objdir/\$libname.ver -o \$lib"

# Commands used to build a loadable module if different from building
# a shared archive.
module_cmds=""
module_expsym_cmds=""

# Whether we are building with GNU ld or not.
with_gnu_ld="yes"

# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=""

# Flag that enforces no undefined symbols.
no_undefined_flag=""

# Flag to hardcode $libdir into a binary during linking.
# This must work even if $libdir does not exist
hardcode_libdir_flag_spec="\$wl-rpath \$wl\$libdir"

# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=""

# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=no

# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
# "absolute",i.e impossible to change by setting $shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=no

# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
# into the resulting binary.
hardcode_minus_L=no

# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
# into the resulting binary.
hardcode_shlibpath_var=unsupported

# Set to "yes" if building a shared library automatically hardcodes DIR
# into the library and all subsequent libraries and executables linked
# against it.
hardcode_automatic=no

# Set to yes if linker adds runtime paths of dependent libraries
# to runtime path list.
inherit_rpath=no

# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=unknown

# Set to "yes" if exported symbols are required.
always_export_symbols=no

# The commands to list exported symbols.
export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols"

# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*"

# Symbols that must always be exported.
include_expsyms=""

# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=""

# Commands necessary for finishing linking programs.
postlink_cmds=""

# Specify filename containing input files.
file_list_spec=""

# How to hardcode a shared library path into an executable.
hardcode_action=immediate

# ### END LIBTOOL CONFIG


# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE

# func_munge_path_list VARIABLE PATH
# -----------------------------------
# VARIABLE is name of variable containing _space_ separated list of
# directories to be munged by the contents of PATH, which is string
# having a format:
# "DIR[:DIR]:"
#       string "DIR[ DIR]" will be prepended to VARIABLE
# ":DIR[:DIR]"
#       string "DIR[ DIR]" will be appended to VARIABLE
# "DIRP[:DIRP]::[DIRA:]DIRA"
#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
#       "DIRA[ DIRA]" will be appended to VARIABLE
# "DIR[:DIR]"
#       VARIABLE will be replaced by "DIR[ DIR]"
func_munge_path_list ()
{
    case x$2 in
    x)
        ;;
    *:)
        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
        ;;
    x:*)
        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
        ;;
    *::*)
        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
        ;;
    *)
        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
        ;;
    esac
}


# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
func_cc_basename ()
{
    for cc_temp in $*""; do
      case $cc_temp in
        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
        \-*) ;;
        *) break;;
      esac
    done
    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
}


# ### END FUNCTIONS SHARED WITH CONFIGURE

#! /bin/sh
## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
##               by inline-source v2014-01-03.01

# libtool (GNU libtool) 2.4.6
# Provide generalized library-building support services.
# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996

# Copyright (C) 1996-2015 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# GNU Libtool is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License,
# if you distribute this file as part of a program or library that
# is built using GNU Libtool, you may include this file under the
# same distribution terms that you use for the rest of that program.
#
# GNU Libtool is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


PROGRAM=libtool
PACKAGE=libtool
VERSION=2.4.6
package_revision=2.4.6


## ------ ##
## Usage. ##
## ------ ##

# Run './libtool --help' for help with using this script from the
# command line.


## ------------------------------- ##
## User overridable command paths. ##
## ------------------------------- ##

# After configure completes, it has a better idea of some of the
# shell tools we need than the defaults used by the functions shared
# with bootstrap, so set those here where they can still be over-
# ridden by the user, but otherwise take precedence.

: ${AUTOCONF="autoconf"}
: ${AUTOMAKE="automake"}


## -------------------------- ##
## Source external libraries. ##
## -------------------------- ##

# Much of our low-level functionality needs to be sourced from external
# libraries, which are installed to $pkgauxdir.

# Set a version string for this script.
scriptversion=2015-01-20.17; # UTC

# General shell script boiler plate, and helper functions.
# Written by Gary V. Vaughan, 2004

# Copyright (C) 2004-2015 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# As a special exception to the GNU General Public License, if you distribute
# this file as part of a program or library that is built using GNU Libtool,
# you may include this file under the same distribution terms that you use
# for the rest of that program.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

# Please report bugs or propose patches to gary@gnu.org.


## ------ ##
## Usage. ##
## ------ ##

# Evaluate this file near the top of your script to gain access to
# the functions and variables defined here:
#
#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
#
# If you need to override any of the default environment variable
# settings, do that before evaluating this file.


## -------------------- ##
## Shell normalisation. ##
## -------------------- ##

# Some shells need a little help to be as Bourne compatible as possible.
# Before doing anything else, make sure all that help has been provided!

DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
fi

# NLS nuisances: We save the old values in case they are required later.
_G_user_locale=
_G_safe_locale=
for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
do
  eval "if test set = \"\${$_G_var+set}\"; then
          save_$_G_var=\$$_G_var
          $_G_var=C
	  export $_G_var
	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
	fi"
done

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

# Make sure IFS has a sensible default
sp=' '
nl='
'
IFS="$sp	$nl"

# There are apparently some retarded systems that use ';' as a PATH separator!
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi



## ------------------------- ##
## Locate command utilities. ##
## ------------------------- ##


# func_executable_p FILE
# ----------------------
# Check that FILE is an executable regular file.
func_executable_p ()
{
    test -f "$1" && test -x "$1"
}


# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
# --------------------------------------------
# Search for either a program that responds to --version with output
# containing "GNU", or else returned by CHECK_FUNC otherwise, by
# trying all the directories in PATH with each of the elements of
# PROGS_LIST.
#
# CHECK_FUNC should accept the path to a candidate program, and
# set $func_check_prog_result if it truncates its output less than
# $_G_path_prog_max characters.
func_path_progs ()
{
    _G_progs_list=$1
    _G_check_func=$2
    _G_PATH=${3-"$PATH"}

    _G_path_prog_max=0
    _G_path_prog_found=false
    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
    for _G_dir in $_G_PATH; do
      IFS=$_G_save_IFS
      test -z "$_G_dir" && _G_dir=.
      for _G_prog_name in $_G_progs_list; do
        for _exeext in '' .EXE; do
          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
          func_executable_p "$_G_path_prog" || continue
          case `"$_G_path_prog" --version 2>&1` in
            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
            *)     $_G_check_func $_G_path_prog
		   func_path_progs_result=$func_check_prog_result
		   ;;
          esac
          $_G_path_prog_found && break 3
        done
      done
    done
    IFS=$_G_save_IFS
    test -z "$func_path_progs_result" && {
      echo "no acceptable sed could be found in \$PATH" >&2
      exit 1
    }
}


# We want to be able to use the functions in this file before configure
# has figured out where the best binaries are kept, which means we have
# to search for them ourselves - except when the results are already set
# where we skip the searches.

# Unless the user overrides by setting SED, search the path for either GNU
# sed, or the sed that truncates its output the least.
test -z "$SED" && {
  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
  for _G_i in 1 2 3 4 5 6 7; do
    _G_sed_script=$_G_sed_script$nl$_G_sed_script
  done
  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
  _G_sed_script=

  func_check_prog_sed ()
  {
    _G_path_prog=$1

    _G_count=0
    printf 0123456789 >conftest.in
    while :
    do
      cat conftest.in conftest.in >conftest.tmp
      mv conftest.tmp conftest.in
      cp conftest.in conftest.nl
      echo '' >> conftest.nl
      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
      diff conftest.out conftest.nl >/dev/null 2>&1 || break
      _G_count=`expr $_G_count + 1`
      if test "$_G_count" -gt "$_G_path_prog_max"; then
        # Best one so far, save it but keep looking for a better one
        func_check_prog_result=$_G_path_prog
        _G_path_prog_max=$_G_count
      fi
      # 10*(2^10) chars as input seems more than enough
      test 10 -lt "$_G_count" && break
    done
    rm -f conftest.in conftest.tmp conftest.nl conftest.out
  }

  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
  rm -f conftest.sed
  SED=$func_path_progs_result
}


# Unless the user overrides by setting GREP, search the path for either GNU
# grep, or the grep that truncates its output the least.
test -z "$GREP" && {
  func_check_prog_grep ()
  {
    _G_path_prog=$1

    _G_count=0
    _G_path_prog_max=0
    printf 0123456789 >conftest.in
    while :
    do
      cat conftest.in conftest.in >conftest.tmp
      mv conftest.tmp conftest.in
      cp conftest.in conftest.nl
      echo 'GREP' >> conftest.nl
      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
      diff conftest.out conftest.nl >/dev/null 2>&1 || break
      _G_count=`expr $_G_count + 1`
      if test "$_G_count" -gt "$_G_path_prog_max"; then
        # Best one so far, save it but keep looking for a better one
        func_check_prog_result=$_G_path_prog
        _G_path_prog_max=$_G_count
      fi
      # 10*(2^10) chars as input seems more than enough
      test 10 -lt "$_G_count" && break
    done
    rm -f conftest.in conftest.tmp conftest.nl conftest.out
  }

  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
  GREP=$func_path_progs_result
}


## ------------------------------- ##
## User overridable command paths. ##
## ------------------------------- ##

# All uppercase variable names are used for environment variables.  These
# variables can be overridden by the user before calling a script that
# uses them if a suitable command of that name is not already available
# in the command search PATH.

: ${CP="cp -f"}
: ${ECHO="printf %s\n"}
: ${EGREP="$GREP -E"}
: ${FGREP="$GREP -F"}
: ${LN_S="ln -s"}
: ${MAKE="make"}
: ${MKDIR="mkdir"}
: ${MV="mv -f"}
: ${RM="rm -f"}
: ${SHELL="${CONFIG_SHELL-/bin/sh}"}


## -------------------- ##
## Useful sed snippets. ##
## -------------------- ##

sed_dirname='s|/[^/]*$||'
sed_basename='s|^.*/||'

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Same as above, but do not quote variable references.
sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'

# Sed substitution that turns a string into a regex matching for the
# string literally.
sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'

# Sed substitution that converts a w32 file name or path
# that contains forward slashes, into one that contains
# (escaped) backslashes.  A very naive implementation.
sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'

# Re-'\' parameter expansions in output of sed_double_quote_subst that
# were '\'-ed in input to the same.  If an odd number of '\' preceded a
# '$' in input to sed_double_quote_subst, that '$' was protected from
# expansion.  Since each input '\' is now two '\'s, look for any number
# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
_G_bs='\\'
_G_bs2='\\\\'
_G_bs4='\\\\\\\\'
_G_dollar='\$'
sed_double_backslash="\
  s/$_G_bs4/&\\
/g
  s/^$_G_bs2$_G_dollar/$_G_bs&/
  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
  s/\n//g"


## ----------------- ##
## Global variables. ##
## ----------------- ##

# Except for the global variables explicitly listed below, the following
# functions in the '^func_' namespace, and the '^require_' namespace
# variables initialised in the 'Resource management' section, sourcing
# this file will not pollute your global namespace with anything
# else. There's no portable way to scope variables in Bourne shell
# though, so actually running these functions will sometimes place
# results into a variable named after the function, and often use
# temporary variables in the '^_G_' namespace. If you are careful to
# avoid using those namespaces casually in your sourcing script, things
# should continue to work as you expect. And, of course, you can freely
# overwrite any of the functions or variables defined here before
# calling anything to customize them.

EXIT_SUCCESS=0
EXIT_FAILURE=1
EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.

# Allow overriding, eg assuming that you follow the convention of
# putting '$debug_cmd' at the start of all your functions, you can get
# bash to show function call trace with:
#
#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
debug_cmd=${debug_cmd-":"}
exit_cmd=:

# By convention, finish your script with:
#
#    exit $exit_status
#
# so that you can set exit_status to non-zero if you want to indicate
# something went wrong during execution without actually bailing out at
# the point of failure.
exit_status=$EXIT_SUCCESS

# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
# is ksh but when the shell is invoked as "sh" and the current value of
# the _XPG environment variable is not equal to 1 (one), the special
# positional parameter $0, within a function call, is the name of the
# function.
progpath=$0

# The name of this program.
progname=`$ECHO "$progpath" |$SED "$sed_basename"`

# Make sure we have an absolute progpath for reexecution:
case $progpath in
  [\\/]*|[A-Za-z]:\\*) ;;
  *[\\/]*)
     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
     progdir=`cd "$progdir" && pwd`
     progpath=$progdir/$progname
     ;;
  *)
     _G_IFS=$IFS
     IFS=${PATH_SEPARATOR-:}
     for progdir in $PATH; do
       IFS=$_G_IFS
       test -x "$progdir/$progname" && break
     done
     IFS=$_G_IFS
     test -n "$progdir" || progdir=`pwd`
     progpath=$progdir/$progname
     ;;
esac


## ----------------- ##
## Standard options. ##
## ----------------- ##

# The following options affect the operation of the functions defined
# below, and should be set appropriately depending on run-time para-
# meters passed on the command line.

opt_dry_run=false
opt_quiet=false
opt_verbose=false

# Categories 'all' and 'none' are always available.  Append any others
# you will pass as the first argument to func_warning from your own
# code.
warning_categories=

# By default, display warnings according to 'opt_warning_types'.  Set
# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
# treat the next displayed warning as a fatal error.
warning_func=func_warn_and_continue

# Set to 'all' to display all warnings, 'none' to suppress all
# warnings, or a space delimited list of some subset of
# 'warning_categories' to display only the listed warnings.
opt_warning_types=all


## -------------------- ##
## Resource management. ##
## -------------------- ##

# This section contains definitions for functions that each ensure a
# particular resource (a file, or a non-empty configuration variable for
# example) is available, and if appropriate to extract default values
# from pertinent package files. Call them using their associated
# 'require_*' variable to ensure that they are executed, at most, once.
#
# It's entirely deliberate that calling these functions can set
# variables that don't obey the namespace limitations obeyed by the rest
# of this file, in order that that they be as useful as possible to
# callers.


# require_term_colors
# -------------------
# Allow display of bold text on terminals that support it.
require_term_colors=func_require_term_colors
func_require_term_colors ()
{
    $debug_cmd

    test -t 1 && {
      # COLORTERM and USE_ANSI_COLORS environment variables take
      # precedence, because most terminfo databases neglect to describe
      # whether color sequences are supported.
      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}

      if test 1 = "$USE_ANSI_COLORS"; then
        # Standard ANSI escape sequences
        tc_reset=''
        tc_bold='';   tc_standout=''
        tc_red='';   tc_green=''
        tc_blue='';  tc_cyan=''
      else
        # Otherwise trust the terminfo database after all.
        test -n "`tput sgr0 2>/dev/null`" && {
          tc_reset=`tput sgr0`
          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
          tc_standout=$tc_bold
          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
        }
      fi
    }

    require_term_colors=:
}


## ----------------- ##
## Function library. ##
## ----------------- ##

# This section contains a variety of useful functions to call in your
# scripts. Take note of the portable wrappers for features provided by
# some modern shells, which will fall back to slower equivalents on
# less featureful shells.


# func_append VAR VALUE
# ---------------------
# Append VALUE onto the existing contents of VAR.

  # We should try to minimise forks, especially on Windows where they are
  # unreasonably slow, so skip the feature probes when bash or zsh are
  # being used:
  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
    : ${_G_HAVE_ARITH_OP="yes"}
    : ${_G_HAVE_XSI_OPS="yes"}
    # The += operator was introduced in bash 3.1
    case $BASH_VERSION in
      [12].* | 3.0 | 3.0*) ;;
      *)
        : ${_G_HAVE_PLUSEQ_OP="yes"}
        ;;
    esac
  fi

  # _G_HAVE_PLUSEQ_OP
  # Can be empty, in which case the shell is probed, "yes" if += is
  # useable or anything else if it does not work.
  test -z "$_G_HAVE_PLUSEQ_OP" \
    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
    && _G_HAVE_PLUSEQ_OP=yes

if test yes = "$_G_HAVE_PLUSEQ_OP"
then
  # This is an XSI compatible shell, allowing a faster implementation...
  eval 'func_append ()
  {
    $debug_cmd

    eval "$1+=\$2"
  }'
else
  # ...otherwise fall back to using expr, which is often a shell builtin.
  func_append ()
  {
    $debug_cmd

    eval "$1=\$$1\$2"
  }
fi


# func_append_quoted VAR VALUE
# ----------------------------
# Quote VALUE and append to the end of shell variable VAR, separated
# by a space.
if test yes = "$_G_HAVE_PLUSEQ_OP"; then
  eval 'func_append_quoted ()
  {
    $debug_cmd

    func_quote_for_eval "$2"
    eval "$1+=\\ \$func_quote_for_eval_result"
  }'
else
  func_append_quoted ()
  {
    $debug_cmd

    func_quote_for_eval "$2"
    eval "$1=\$$1\\ \$func_quote_for_eval_result"
  }
fi


# func_append_uniq VAR VALUE
# --------------------------
# Append unique VALUE onto the existing contents of VAR, assuming
# entries are delimited by the first character of VALUE.  For example:
#
#   func_append_uniq options " --another-option option-argument"
#
# will only append to $options if " --another-option option-argument "
# is not already present somewhere in $options already (note spaces at
# each end implied by leading space in second argument).
func_append_uniq ()
{
    $debug_cmd

    eval _G_current_value='`$ECHO $'$1'`'
    _G_delim=`expr "$2" : '\(.\)'`

    case $_G_delim$_G_current_value$_G_delim in
      *"$2$_G_delim"*) ;;
      *) func_append "$@" ;;
    esac
}


# func_arith TERM...
# ------------------
# Set func_arith_result to the result of evaluating TERMs.
  test -z "$_G_HAVE_ARITH_OP" \
    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
    && _G_HAVE_ARITH_OP=yes

if test yes = "$_G_HAVE_ARITH_OP"; then
  eval 'func_arith ()
  {
    $debug_cmd

    func_arith_result=$(( $* ))
  }'
else
  func_arith ()
  {
    $debug_cmd

    func_arith_result=`expr "$@"`
  }
fi


# func_basename FILE
# ------------------
# Set func_basename_result to FILE with everything up to and including
# the last / stripped.
if test yes = "$_G_HAVE_XSI_OPS"; then
  # If this shell supports suffix pattern removal, then use it to avoid
  # forking. Hide the definitions single quotes in case the shell chokes
  # on unsupported syntax...
  _b='func_basename_result=${1##*/}'
  _d='case $1 in
        */*) func_dirname_result=${1%/*}$2 ;;
        *  ) func_dirname_result=$3        ;;
      esac'

else
  # ...otherwise fall back to using sed.
  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
      if test "X$func_dirname_result" = "X$1"; then
        func_dirname_result=$3
      else
        func_append func_dirname_result "$2"
      fi'
fi

eval 'func_basename ()
{
    $debug_cmd

    '"$_b"'
}'


# func_dirname FILE APPEND NONDIR_REPLACEMENT
# -------------------------------------------
# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
# otherwise set result to NONDIR_REPLACEMENT.
eval 'func_dirname ()
{
    $debug_cmd

    '"$_d"'
}'


# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
# --------------------------------------------------------
# Perform func_basename and func_dirname in a single function
# call:
#   dirname:  Compute the dirname of FILE.  If nonempty,
#             add APPEND to the result, otherwise set result
#             to NONDIR_REPLACEMENT.
#             value returned in "$func_dirname_result"
#   basename: Compute filename of FILE.
#             value retuned in "$func_basename_result"
# For efficiency, we do not delegate to the functions above but instead
# duplicate the functionality here.
eval 'func_dirname_and_basename ()
{
    $debug_cmd

    '"$_b"'
    '"$_d"'
}'


# func_echo ARG...
# ----------------
# Echo program name prefixed message.
func_echo ()
{
    $debug_cmd

    _G_message=$*

    func_echo_IFS=$IFS
    IFS=$nl
    for _G_line in $_G_message; do
      IFS=$func_echo_IFS
      $ECHO "$progname: $_G_line"
    done
    IFS=$func_echo_IFS
}


# func_echo_all ARG...
# --------------------
# Invoke $ECHO with all args, space-separated.
func_echo_all ()
{
    $ECHO "$*"
}


# func_echo_infix_1 INFIX ARG...
# ------------------------------
# Echo program name, followed by INFIX on the first line, with any
# additional lines not showing INFIX.
func_echo_infix_1 ()
{
    $debug_cmd

    $require_term_colors

    _G_infix=$1; shift
    _G_indent=$_G_infix
    _G_prefix="$progname: $_G_infix: "
    _G_message=$*

    # Strip color escape sequences before counting printable length
    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
    do
      test -n "$_G_tc" && {
        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
      }
    done
    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes

    func_echo_infix_1_IFS=$IFS
    IFS=$nl
    for _G_line in $_G_message; do
      IFS=$func_echo_infix_1_IFS
      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
      _G_prefix=$_G_indent
    done
    IFS=$func_echo_infix_1_IFS
}


# func_error ARG...
# -----------------
# Echo program name prefixed message to standard error.
func_error ()
{
    $debug_cmd

    $require_term_colors

    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
}


# func_fatal_error ARG...
# -----------------------
# Echo program name prefixed message to standard error, and exit.
func_fatal_error ()
{
    $debug_cmd

    func_error "$*"
    exit $EXIT_FAILURE
}


# func_grep EXPRESSION FILENAME
# -----------------------------
# Check whether EXPRESSION matches any line of FILENAME, without output.
func_grep ()
{
    $debug_cmd

    $GREP "$1" "$2" >/dev/null 2>&1
}


# func_len STRING
# ---------------
# Set func_len_result to the length of STRING. STRING may not
# start with a hyphen.
  test -z "$_G_HAVE_XSI_OPS" \
    && (eval 'x=a/b/c;
      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
    && _G_HAVE_XSI_OPS=yes

if test yes = "$_G_HAVE_XSI_OPS"; then
  eval 'func_len ()
  {
    $debug_cmd

    func_len_result=${#1}
  }'
else
  func_len ()
  {
    $debug_cmd

    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
  }
fi


# func_mkdir_p DIRECTORY-PATH
# ---------------------------
# Make sure the entire path to DIRECTORY-PATH is available.
func_mkdir_p ()
{
    $debug_cmd

    _G_directory_path=$1
    _G_dir_list=

    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then

      # Protect directory names starting with '-'
      case $_G_directory_path in
        -*) _G_directory_path=./$_G_directory_path ;;
      esac

      # While some portion of DIR does not yet exist...
      while test ! -d "$_G_directory_path"; do
        # ...make a list in topmost first order.  Use a colon delimited
	# list incase some portion of path contains whitespace.
        _G_dir_list=$_G_directory_path:$_G_dir_list

        # If the last portion added has no slash in it, the list is done
        case $_G_directory_path in */*) ;; *) break ;; esac

        # ...otherwise throw away the child directory and loop
        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
      done
      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`

      func_mkdir_p_IFS=$IFS; IFS=:
      for _G_dir in $_G_dir_list; do
	IFS=$func_mkdir_p_IFS
        # mkdir can fail with a 'File exist' error if two processes
        # try to create one of the directories concurrently.  Don't
        # stop in that case!
        $MKDIR "$_G_dir" 2>/dev/null || :
      done
      IFS=$func_mkdir_p_IFS

      # Bail out if we (or some other process) failed to create a directory.
      test -d "$_G_directory_path" || \
        func_fatal_error "Failed to create '$1'"
    fi
}


# func_mktempdir [BASENAME]
# -------------------------
# Make a temporary directory that won't clash with other running
# libtool processes, and avoids race conditions if possible.  If
# given, BASENAME is the basename for that directory.
func_mktempdir ()
{
    $debug_cmd

    _G_template=${TMPDIR-/tmp}/${1-$progname}

    if test : = "$opt_dry_run"; then
      # Return a directory name, but don't create it in dry-run mode
      _G_tmpdir=$_G_template-$$
    else

      # If mktemp works, use that first and foremost
      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`

      if test ! -d "$_G_tmpdir"; then
        # Failing that, at least try and use $RANDOM to avoid a race
        _G_tmpdir=$_G_template-${RANDOM-0}$$

        func_mktempdir_umask=`umask`
        umask 0077
        $MKDIR "$_G_tmpdir"
        umask $func_mktempdir_umask
      fi

      # If we're not in dry-run mode, bomb out on failure
      test -d "$_G_tmpdir" || \
        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
    fi

    $ECHO "$_G_tmpdir"
}


# func_normal_abspath PATH
# ------------------------
# Remove doubled-up and trailing slashes, "." path components,
# and cancel out any ".." path components in PATH after making
# it an absolute path.
func_normal_abspath ()
{
    $debug_cmd

    # These SED scripts presuppose an absolute path with a trailing slash.
    _G_pathcar='s|^/\([^/]*\).*$|\1|'
    _G_pathcdr='s|^/[^/]*||'
    _G_removedotparts=':dotsl
		s|/\./|/|g
		t dotsl
		s|/\.$|/|'
    _G_collapseslashes='s|/\{1,\}|/|g'
    _G_finalslash='s|/*$|/|'

    # Start from root dir and reassemble the path.
    func_normal_abspath_result=
    func_normal_abspath_tpath=$1
    func_normal_abspath_altnamespace=
    case $func_normal_abspath_tpath in
      "")
        # Empty path, that just means $cwd.
        func_stripname '' '/' "`pwd`"
        func_normal_abspath_result=$func_stripname_result
        return
        ;;
      # The next three entries are used to spot a run of precisely
      # two leading slashes without using negated character classes;
      # we take advantage of case's first-match behaviour.
      ///*)
        # Unusual form of absolute path, do nothing.
        ;;
      //*)
        # Not necessarily an ordinary path; POSIX reserves leading '//'
        # and for example Cygwin uses it to access remote file shares
        # over CIFS/SMB, so we conserve a leading double slash if found.
        func_normal_abspath_altnamespace=/
        ;;
      /*)
        # Absolute path, do nothing.
        ;;
      *)
        # Relative path, prepend $cwd.
        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
        ;;
    esac

    # Cancel out all the simple stuff to save iterations.  We also want
    # the path to end with a slash for ease of parsing, so make sure
    # there is one (and only one) here.
    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
    while :; do
      # Processed it all yet?
      if test / = "$func_normal_abspath_tpath"; then
        # If we ascended to the root using ".." the result may be empty now.
        if test -z "$func_normal_abspath_result"; then
          func_normal_abspath_result=/
        fi
        break
      fi
      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
          -e "$_G_pathcar"`
      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
          -e "$_G_pathcdr"`
      # Figure out what to do with it
      case $func_normal_abspath_tcomponent in
        "")
          # Trailing empty path component, ignore it.
          ;;
        ..)
          # Parent dir; strip last assembled component from result.
          func_dirname "$func_normal_abspath_result"
          func_normal_abspath_result=$func_dirname_result
          ;;
        *)
          # Actual path component, append it.
          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
          ;;
      esac
    done
    # Restore leading double-slash if one was found on entry.
    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
}


# func_notquiet ARG...
# --------------------
# Echo program name prefixed message only when not in quiet mode.
func_notquiet ()
{
    $debug_cmd

    $opt_quiet || func_echo ${1+"$@"}

    # A bug in bash halts the script if the last line of a function
    # fails when set -e is in force, so we need another command to
    # work around that:
    :
}


# func_relative_path SRCDIR DSTDIR
# --------------------------------
# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
func_relative_path ()
{
    $debug_cmd

    func_relative_path_result=
    func_normal_abspath "$1"
    func_relative_path_tlibdir=$func_normal_abspath_result
    func_normal_abspath "$2"
    func_relative_path_tbindir=$func_normal_abspath_result

    # Ascend the tree starting from libdir
    while :; do
      # check if we have found a prefix of bindir
      case $func_relative_path_tbindir in
        $func_relative_path_tlibdir)
          # found an exact match
          func_relative_path_tcancelled=
          break
          ;;
        $func_relative_path_tlibdir*)
          # found a matching prefix
          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
          func_relative_path_tcancelled=$func_stripname_result
          if test -z "$func_relative_path_result"; then
            func_relative_path_result=.
          fi
          break
          ;;
        *)
          func_dirname $func_relative_path_tlibdir
          func_relative_path_tlibdir=$func_dirname_result
          if test -z "$func_relative_path_tlibdir"; then
            # Have to descend all the way to the root!
            func_relative_path_result=../$func_relative_path_result
            func_relative_path_tcancelled=$func_relative_path_tbindir
            break
          fi
          func_relative_path_result=../$func_relative_path_result
          ;;
      esac
    done

    # Now calculate path; take care to avoid doubling-up slashes.
    func_stripname '' '/' "$func_relative_path_result"
    func_relative_path_result=$func_stripname_result
    func_stripname '/' '/' "$func_relative_path_tcancelled"
    if test -n "$func_stripname_result"; then
      func_append func_relative_path_result "/$func_stripname_result"
    fi

    # Normalisation. If bindir is libdir, return '.' else relative path.
    if test -n "$func_relative_path_result"; then
      func_stripname './' '' "$func_relative_path_result"
      func_relative_path_result=$func_stripname_result
    fi

    test -n "$func_relative_path_result" || func_relative_path_result=.

    :
}


# func_quote_for_eval ARG...
# --------------------------
# Aesthetically quote ARGs to be evaled later.
# This function returns two values:
#   i) func_quote_for_eval_result
#      double-quoted, suitable for a subsequent eval
#  ii) func_quote_for_eval_unquoted_result
#      has all characters that are still active within double
#      quotes backslashified.
func_quote_for_eval ()
{
    $debug_cmd

    func_quote_for_eval_unquoted_result=
    func_quote_for_eval_result=
    while test 0 -lt $#; do
      case $1 in
        *[\\\`\"\$]*)
	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
        *)
          _G_unquoted_arg=$1 ;;
      esac
      if test -n "$func_quote_for_eval_unquoted_result"; then
	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
      else
        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
      fi

      case $_G_unquoted_arg in
        # Double-quote args containing shell metacharacters to delay
        # word splitting, command substitution and variable expansion
        # for a subsequent eval.
        # Many Bourne shells cannot handle close brackets correctly
        # in scan sets, so we specify it separately.
        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
          _G_quoted_arg=\"$_G_unquoted_arg\"
          ;;
        *)
          _G_quoted_arg=$_G_unquoted_arg
	  ;;
      esac

      if test -n "$func_quote_for_eval_result"; then
	func_append func_quote_for_eval_result " $_G_quoted_arg"
      else
        func_append func_quote_for_eval_result "$_G_quoted_arg"
      fi
      shift
    done
}


# func_quote_for_expand ARG
# -------------------------
# Aesthetically quote ARG to be evaled later; same as above,
# but do not quote variable references.
func_quote_for_expand ()
{
    $debug_cmd

    case $1 in
      *[\\\`\"]*)
	_G_arg=`$ECHO "$1" | $SED \
	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
      *)
        _G_arg=$1 ;;
    esac

    case $_G_arg in
      # Double-quote args containing shell metacharacters to delay
      # word splitting and command substitution for a subsequent eval.
      # Many Bourne shells cannot handle close brackets correctly
      # in scan sets, so we specify it separately.
      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
        _G_arg=\"$_G_arg\"
        ;;
    esac

    func_quote_for_expand_result=$_G_arg
}


# func_stripname PREFIX SUFFIX NAME
# ---------------------------------
# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
# PREFIX and SUFFIX must not contain globbing or regex special
# characters, hashes, percent signs, but SUFFIX may contain a leading
# dot (in which case that matches only a dot).
if test yes = "$_G_HAVE_XSI_OPS"; then
  eval 'func_stripname ()
  {
    $debug_cmd

    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
    # positional parameters, so assign one to ordinary variable first.
    func_stripname_result=$3
    func_stripname_result=${func_stripname_result#"$1"}
    func_stripname_result=${func_stripname_result%"$2"}
  }'
else
  func_stripname ()
  {
    $debug_cmd

    case $2 in
      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
    esac
  }
fi


# func_show_eval CMD [FAIL_EXP]
# -----------------------------
# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
# is given, then evaluate it.
func_show_eval ()
{
    $debug_cmd

    _G_cmd=$1
    _G_fail_exp=${2-':'}

    func_quote_for_expand "$_G_cmd"
    eval "func_notquiet $func_quote_for_expand_result"

    $opt_dry_run || {
      eval "$_G_cmd"
      _G_status=$?
      if test 0 -ne "$_G_status"; then
	eval "(exit $_G_status); $_G_fail_exp"
      fi
    }
}


# func_show_eval_locale CMD [FAIL_EXP]
# ------------------------------------
# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
# is given, then evaluate it.  Use the saved locale for evaluation.
func_show_eval_locale ()
{
    $debug_cmd

    _G_cmd=$1
    _G_fail_exp=${2-':'}

    $opt_quiet || {
      func_quote_for_expand "$_G_cmd"
      eval "func_echo $func_quote_for_expand_result"
    }

    $opt_dry_run || {
      eval "$_G_user_locale
	    $_G_cmd"
      _G_status=$?
      eval "$_G_safe_locale"
      if test 0 -ne "$_G_status"; then
	eval "(exit $_G_status); $_G_fail_exp"
      fi
    }
}


# func_tr_sh
# ----------
# Turn $1 into a string suitable for a shell variable name.
# Result is stored in $func_tr_sh_result.  All characters
# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
# if $1 begins with a digit, a '_' is prepended as well.
func_tr_sh ()
{
    $debug_cmd

    case $1 in
    [0-9]* | *[!a-zA-Z0-9_]*)
      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
      ;;
    * )
      func_tr_sh_result=$1
      ;;
    esac
}


# func_verbose ARG...
# -------------------
# Echo program name prefixed message in verbose mode only.
func_verbose ()
{
    $debug_cmd

    $opt_verbose && func_echo "$*"

    :
}


# func_warn_and_continue ARG...
# -----------------------------
# Echo program name prefixed warning message to standard error.
func_warn_and_continue ()
{
    $debug_cmd

    $require_term_colors

    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
}


# func_warning CATEGORY ARG...
# ----------------------------
# Echo program name prefixed warning message to standard error. Warning
# messages can be filtered according to CATEGORY, where this function
# elides messages where CATEGORY is not listed in the global variable
# 'opt_warning_types'.
func_warning ()
{
    $debug_cmd

    # CATEGORY must be in the warning_categories list!
    case " $warning_categories " in
      *" $1 "*) ;;
      *) func_internal_error "invalid warning category '$1'" ;;
    esac

    _G_category=$1
    shift

    case " $opt_warning_types " in
      *" $_G_category "*) $warning_func ${1+"$@"} ;;
    esac
}


# func_sort_ver VER1 VER2
# -----------------------
# 'sort -V' is not generally available.
# Note this deviates from the version comparison in automake
# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
# but this should suffice as we won't be specifying old
# version formats or redundant trailing .0 in bootstrap.conf.
# If we did want full compatibility then we should probably
# use m4_version_compare from autoconf.
func_sort_ver ()
{
    $debug_cmd

    printf '%s\n%s\n' "$1" "$2" \
      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
}

# func_lt_ver PREV CURR
# ---------------------
# Return true if PREV and CURR are in the correct order according to
# func_sort_ver, otherwise false.  Use it like this:
#
#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
func_lt_ver ()
{
    $debug_cmd

    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
}


# Local variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
# time-stamp-time-zone: "UTC"
# End:
#! /bin/sh

# Set a version string for this script.
scriptversion=2014-01-07.03; # UTC

# A portable, pluggable option parser for Bourne shell.
# Written by Gary V. Vaughan, 2010

# Copyright (C) 2010-2015 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Please report bugs or propose patches to gary@gnu.org.


## ------ ##
## Usage. ##
## ------ ##

# This file is a library for parsing options in your shell scripts along
# with assorted other useful supporting features that you can make use
# of too.
#
# For the simplest scripts you might need only:
#
#   #!/bin/sh
#   . relative/path/to/funclib.sh
#   . relative/path/to/options-parser
#   scriptversion=1.0
#   func_options ${1+"$@"}
#   eval set dummy "$func_options_result"; shift
#   ...rest of your script...
#
# In order for the '--version' option to work, you will need to have a
# suitably formatted comment like the one at the top of this file
# starting with '# Written by ' and ending with '# warranty; '.
#
# For '-h' and '--help' to work, you will also need a one line
# description of your script's purpose in a comment directly above the
# '# Written by ' line, like the one at the top of this file.
#
# The default options also support '--debug', which will turn on shell
# execution tracing (see the comment above debug_cmd below for another
# use), and '--verbose' and the func_verbose function to allow your script
# to display verbose messages only when your user has specified
# '--verbose'.
#
# After sourcing this file, you can plug processing for additional
# options by amending the variables from the 'Configuration' section
# below, and following the instructions in the 'Option parsing'
# section further down.

## -------------- ##
## Configuration. ##
## -------------- ##

# You should override these variables in your script after sourcing this
# file so that they reflect the customisations you have added to the
# option parser.

# The usage line for option parsing errors and the start of '-h' and
# '--help' output messages. You can embed shell variables for delayed
# expansion at the time the message is displayed, but you will need to
# quote other shell meta-characters carefully to prevent them being
# expanded when the contents are evaled.
usage='$progpath [OPTION]...'

# Short help message in response to '-h' and '--help'.  Add to this or
# override it after sourcing this library to reflect the full set of
# options your script accepts.
usage_message="\
       --debug        enable verbose shell tracing
   -W, --warnings=CATEGORY
                      report the warnings falling in CATEGORY [all]
   -v, --verbose      verbosely report processing
       --version      print version information and exit
   -h, --help         print short or long help message and exit
"

# Additional text appended to 'usage_message' in response to '--help'.
long_help_message="
Warning categories include:
       'all'          show all warnings
       'none'         turn off all the warnings
       'error'        warnings are treated as fatal errors"

# Help message printed before fatal option parsing errors.
fatal_help="Try '\$progname --help' for more information."



## ------------------------- ##
## Hook function management. ##
## ------------------------- ##

# This section contains functions for adding, removing, and running hooks
# to the main code.  A hook is just a named list of of function, that can
# be run in order later on.

# func_hookable FUNC_NAME
# -----------------------
# Declare that FUNC_NAME will run hooks added with
# 'func_add_hook FUNC_NAME ...'.
func_hookable ()
{
    $debug_cmd

    func_append hookable_fns " $1"
}


# func_add_hook FUNC_NAME HOOK_FUNC
# ---------------------------------
# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
# first have been declared "hookable" by a call to 'func_hookable'.
func_add_hook ()
{
    $debug_cmd

    case " $hookable_fns " in
      *" $1 "*) ;;
      *) func_fatal_error "'$1' does not accept hook functions." ;;
    esac

    eval func_append ${1}_hooks '" $2"'
}


# func_remove_hook FUNC_NAME HOOK_FUNC
# ------------------------------------
# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
func_remove_hook ()
{
    $debug_cmd

    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
}


# func_run_hooks FUNC_NAME [ARG]...
# ---------------------------------
# Run all hook functions registered to FUNC_NAME.
# It is assumed that the list of hook functions contains nothing more
# than a whitespace-delimited list of legal shell function names, and
# no effort is wasted trying to catch shell meta-characters or preserve
# whitespace.
func_run_hooks ()
{
    $debug_cmd

    case " $hookable_fns " in
      *" $1 "*) ;;
      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
    esac

    eval _G_hook_fns=\$$1_hooks; shift

    for _G_hook in $_G_hook_fns; do
      eval $_G_hook '"$@"'

      # store returned options list back into positional
      # parameters for next 'cmd' execution.
      eval _G_hook_result=\$${_G_hook}_result
      eval set dummy "$_G_hook_result"; shift
    done

    func_quote_for_eval ${1+"$@"}
    func_run_hooks_result=$func_quote_for_eval_result
}



## --------------- ##
## Option parsing. ##
## --------------- ##

# In order to add your own option parsing hooks, you must accept the
# full positional parameter list in your hook function, remove any
# options that you action, and then pass back the remaining unprocessed
# options in '<hooked_function_name>_result', escaped suitably for
# 'eval'.  Like this:
#
#    my_options_prep ()
#    {
#        $debug_cmd
#
#        # Extend the existing usage message.
#        usage_message=$usage_message'
#      -s, --silent       don'\''t print informational messages
#    '
#
#        func_quote_for_eval ${1+"$@"}
#        my_options_prep_result=$func_quote_for_eval_result
#    }
#    func_add_hook func_options_prep my_options_prep
#
#
#    my_silent_option ()
#    {
#        $debug_cmd
#
#        # Note that for efficiency, we parse as many options as we can
#        # recognise in a loop before passing the remainder back to the
#        # caller on the first unrecognised argument we encounter.
#        while test $# -gt 0; do
#          opt=$1; shift
#          case $opt in
#            --silent|-s) opt_silent=: ;;
#            # Separate non-argument short options:
#            -s*)         func_split_short_opt "$_G_opt"
#                         set dummy "$func_split_short_opt_name" \
#                             "-$func_split_short_opt_arg" ${1+"$@"}
#                         shift
#                         ;;
#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
#          esac
#        done
#
#        func_quote_for_eval ${1+"$@"}
#        my_silent_option_result=$func_quote_for_eval_result
#    }
#    func_add_hook func_parse_options my_silent_option
#
#
#    my_option_validation ()
#    {
#        $debug_cmd
#
#        $opt_silent && $opt_verbose && func_fatal_help "\
#    '--silent' and '--verbose' options are mutually exclusive."
#
#        func_quote_for_eval ${1+"$@"}
#        my_option_validation_result=$func_quote_for_eval_result
#    }
#    func_add_hook func_validate_options my_option_validation
#
# You'll alse need to manually amend $usage_message to reflect the extra
# options you parse.  It's preferable to append if you can, so that
# multiple option parsing hooks can be added safely.


# func_options [ARG]...
# ---------------------
# All the functions called inside func_options are hookable. See the
# individual implementations for details.
func_hookable func_options
func_options ()
{
    $debug_cmd

    func_options_prep ${1+"$@"}
    eval func_parse_options \
        ${func_options_prep_result+"$func_options_prep_result"}
    eval func_validate_options \
        ${func_parse_options_result+"$func_parse_options_result"}

    eval func_run_hooks func_options \
        ${func_validate_options_result+"$func_validate_options_result"}

    # save modified positional parameters for caller
    func_options_result=$func_run_hooks_result
}


# func_options_prep [ARG]...
# --------------------------
# All initialisations required before starting the option parse loop.
# Note that when calling hook functions, we pass through the list of
# positional parameters.  If a hook function modifies that list, and
# needs to propogate that back to rest of this script, then the complete
# modified list must be put in 'func_run_hooks_result' before
# returning.
func_hookable func_options_prep
func_options_prep ()
{
    $debug_cmd

    # Option defaults:
    opt_verbose=false
    opt_warning_types=

    func_run_hooks func_options_prep ${1+"$@"}

    # save modified positional parameters for caller
    func_options_prep_result=$func_run_hooks_result
}


# func_parse_options [ARG]...
# ---------------------------
# The main option parsing loop.
func_hookable func_parse_options
func_parse_options ()
{
    $debug_cmd

    func_parse_options_result=

    # this just eases exit handling
    while test $# -gt 0; do
      # Defer to hook functions for initial option parsing, so they
      # get priority in the event of reusing an option name.
      func_run_hooks func_parse_options ${1+"$@"}

      # Adjust func_parse_options positional parameters to match
      eval set dummy "$func_run_hooks_result"; shift

      # Break out of the loop if we already parsed every option.
      test $# -gt 0 || break

      _G_opt=$1
      shift
      case $_G_opt in
        --debug|-x)   debug_cmd='set -x'
                      func_echo "enabling shell trace mode"
                      $debug_cmd
                      ;;

        --no-warnings|--no-warning|--no-warn)
                      set dummy --warnings none ${1+"$@"}
                      shift
		      ;;

        --warnings|--warning|-W)
                      test $# = 0 && func_missing_arg $_G_opt && break
                      case " $warning_categories $1" in
                        *" $1 "*)
                          # trailing space prevents matching last $1 above
                          func_append_uniq opt_warning_types " $1"
                          ;;
                        *all)
                          opt_warning_types=$warning_categories
                          ;;
                        *none)
                          opt_warning_types=none
                          warning_func=:
                          ;;
                        *error)
                          opt_warning_types=$warning_categories
                          warning_func=func_fatal_error
                          ;;
                        *)
                          func_fatal_error \
                             "unsupported warning category: '$1'"
                          ;;
                      esac
                      shift
                      ;;

        --verbose|-v) opt_verbose=: ;;
        --version)    func_version ;;
        -\?|-h)       func_usage ;;
        --help)       func_help ;;

	# Separate optargs to long options (plugins may need this):
	--*=*)        func_split_equals "$_G_opt"
	              set dummy "$func_split_equals_lhs" \
                          "$func_split_equals_rhs" ${1+"$@"}
                      shift
                      ;;

       # Separate optargs to short options:
        -W*)
                      func_split_short_opt "$_G_opt"
                      set dummy "$func_split_short_opt_name" \
                          "$func_split_short_opt_arg" ${1+"$@"}
                      shift
                      ;;

        # Separate non-argument short options:
        -\?*|-h*|-v*|-x*)
                      func_split_short_opt "$_G_opt"
                      set dummy "$func_split_short_opt_name" \
                          "-$func_split_short_opt_arg" ${1+"$@"}
                      shift
                      ;;

        --)           break ;;
        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
      esac
    done

    # save modified positional parameters for caller
    func_quote_for_eval ${1+"$@"}
    func_parse_options_result=$func_quote_for_eval_result
}


# func_validate_options [ARG]...
# ------------------------------
# Perform any sanity checks on option settings and/or unconsumed
# arguments.
func_hookable func_validate_options
func_validate_options ()
{
    $debug_cmd

    # Display all warnings if -W was not given.
    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"

    func_run_hooks func_validate_options ${1+"$@"}

    # Bail if the options were screwed!
    $exit_cmd $EXIT_FAILURE

    # save modified positional parameters for caller
    func_validate_options_result=$func_run_hooks_result
}



## ----------------- ##
## Helper functions. ##
## ----------------- ##

# This section contains the helper functions used by the rest of the
# hookable option parser framework in ascii-betical order.


# func_fatal_help ARG...
# ----------------------
# Echo program name prefixed message to standard error, followed by
# a help hint, and exit.
func_fatal_help ()
{
    $debug_cmd

    eval \$ECHO \""Usage: $usage"\"
    eval \$ECHO \""$fatal_help"\"
    func_error ${1+"$@"}
    exit $EXIT_FAILURE
}


# func_help
# ---------
# Echo long help message to standard output and exit.
func_help ()
{
    $debug_cmd

    func_usage_message
    $ECHO "$long_help_message"
    exit 0
}


# func_missing_arg ARGNAME
# ------------------------
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
    $debug_cmd

    func_error "Missing argument for '$1'."
    exit_cmd=exit
}


# func_split_equals STRING
# ------------------------
# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
# splitting STRING at the '=' sign.
test -z "$_G_HAVE_XSI_OPS" \
    && (eval 'x=a/b/c;
      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
    && _G_HAVE_XSI_OPS=yes

if test yes = "$_G_HAVE_XSI_OPS"
then
  # This is an XSI compatible shell, allowing a faster implementation...
  eval 'func_split_equals ()
  {
      $debug_cmd

      func_split_equals_lhs=${1%%=*}
      func_split_equals_rhs=${1#*=}
      test "x$func_split_equals_lhs" = "x$1" \
        && func_split_equals_rhs=
  }'
else
  # ...otherwise fall back to using expr, which is often a shell builtin.
  func_split_equals ()
  {
      $debug_cmd

      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
      func_split_equals_rhs=
      test "x$func_split_equals_lhs" = "x$1" \
        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
  }
fi #func_split_equals


# func_split_short_opt SHORTOPT
# -----------------------------
# Set func_split_short_opt_name and func_split_short_opt_arg shell
# variables after splitting SHORTOPT after the 2nd character.
if test yes = "$_G_HAVE_XSI_OPS"
then
  # This is an XSI compatible shell, allowing a faster implementation...
  eval 'func_split_short_opt ()
  {
      $debug_cmd

      func_split_short_opt_arg=${1#??}
      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
  }'
else
  # ...otherwise fall back to using expr, which is often a shell builtin.
  func_split_short_opt ()
  {
      $debug_cmd

      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
  }
fi #func_split_short_opt


# func_usage
# ----------
# Echo short help message to standard output and exit.
func_usage ()
{
    $debug_cmd

    func_usage_message
    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
    exit 0
}


# func_usage_message
# ------------------
# Echo short help message to standard output.
func_usage_message ()
{
    $debug_cmd

    eval \$ECHO \""Usage: $usage"\"
    echo
    $SED -n 's|^# ||
        /^Written by/{
          x;p;x
        }
	h
	/^Written by/q' < "$progpath"
    echo
    eval \$ECHO \""$usage_message"\"
}


# func_version
# ------------
# Echo version message to standard output and exit.
func_version ()
{
    $debug_cmd

    printf '%s\n' "$progname $scriptversion"
    $SED -n '
        /(C)/!b go
        :more
        /\./!{
          N
          s|\n# | |
          b more
        }
        :go
        /^# Written by /,/# warranty; / {
          s|^# ||
          s|^# *$||
          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
          p
        }
        /^# Written by / {
          s|^# ||
          p
        }
        /^warranty; /q' < "$progpath"

    exit $?
}


# Local variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
# time-stamp-time-zone: "UTC"
# End:

# Set a version string.
scriptversion='(GNU libtool) 2.4.6'


# func_echo ARG...
# ----------------
# Libtool also displays the current mode in messages, so override
# funclib.sh func_echo with this custom definition.
func_echo ()
{
    $debug_cmd

    _G_message=$*

    func_echo_IFS=$IFS
    IFS=$nl
    for _G_line in $_G_message; do
      IFS=$func_echo_IFS
      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
    done
    IFS=$func_echo_IFS
}


# func_warning ARG...
# -------------------
# Libtool warnings are not categorized, so override funclib.sh
# func_warning with this simpler definition.
func_warning ()
{
    $debug_cmd

    $warning_func ${1+"$@"}
}


## ---------------- ##
## Options parsing. ##
## ---------------- ##

# Hook in the functions to make sure our own options are parsed during
# the option parsing loop.

usage='$progpath [OPTION]... [MODE-ARG]...'

# Short help message in response to '-h'.
usage_message="Options:
       --config             show all configuration variables
       --debug              enable verbose shell tracing
   -n, --dry-run            display commands without modifying any files
       --features           display basic configuration information and exit
       --mode=MODE          use operation mode MODE
       --no-warnings        equivalent to '-Wnone'
       --preserve-dup-deps  don't remove duplicate dependency libraries
       --quiet, --silent    don't print informational messages
       --tag=TAG            use configuration variables from tag TAG
   -v, --verbose            print more informational messages than default
       --version            print version information
   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
   -h, --help, --help-all   print short, long, or detailed help message
"

# Additional text appended to 'usage_message' in response to '--help'.
func_help ()
{
    $debug_cmd

    func_usage_message
    $ECHO "$long_help_message

MODE must be one of the following:

       clean           remove files from the build directory
       compile         compile a source file into a libtool object
       execute         automatically set library path, then run a program
       finish          complete the installation of libtool libraries
       install         install libraries or executables
       link            create a library or an executable
       uninstall       remove libraries from an installed directory

MODE-ARGS vary depending on the MODE.  When passed as first option,
'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
Try '$progname --help --mode=MODE' for a more detailed description of MODE.

When reporting a bug, please describe a test case to reproduce it and
include the following information:

       host-triplet:   $host
       shell:          $SHELL
       compiler:       $LTCC
       compiler flags: $LTCFLAGS
       linker:         $LD (gnu? $with_gnu_ld)
       version:        $progname (GNU libtool) 2.4.6
       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`

Report bugs to <bug-libtool@gnu.org>.
GNU libtool home page: <http://www.gnu.org/software/libtool/>.
General help using GNU software: <http://www.gnu.org/gethelp/>."
    exit 0
}


# func_lo2o OBJECT-NAME
# ---------------------
# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
# object suffix.

lo2o=s/\\.lo\$/.$objext/
o2lo=s/\\.$objext\$/.lo/

if test yes = "$_G_HAVE_XSI_OPS"; then
  eval 'func_lo2o ()
  {
    case $1 in
      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
      *   ) func_lo2o_result=$1               ;;
    esac
  }'

  # func_xform LIBOBJ-OR-SOURCE
  # ---------------------------
  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
  # suffix to a '.lo' libtool-object suffix.
  eval 'func_xform ()
  {
    func_xform_result=${1%.*}.lo
  }'
else
  # ...otherwise fall back to using sed.
  func_lo2o ()
  {
    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
  }

  func_xform ()
  {
    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
  }
fi


# func_fatal_configuration ARG...
# -------------------------------
# Echo program name prefixed message to standard error, followed by
# a configuration failure hint, and exit.
func_fatal_configuration ()
{
    func__fatal_error ${1+"$@"} \
      "See the $PACKAGE documentation for more information." \
      "Fatal configuration error."
}


# func_config
# -----------
# Display the configuration for all the tags in this script.
func_config ()
{
    re_begincf='^# ### BEGIN LIBTOOL'
    re_endcf='^# ### END LIBTOOL'

    # Default configuration.
    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"

    # Now print the configurations for the tags.
    for tagname in $taglist; do
      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
    done

    exit $?
}


# func_features
# -------------
# Display the features supported by this script.
func_features ()
{
    echo "host: $host"
    if test yes = "$build_libtool_libs"; then
      echo "enable shared libraries"
    else
      echo "disable shared libraries"
    fi
    if test yes = "$build_old_libs"; then
      echo "enable static libraries"
    else
      echo "disable static libraries"
    fi

    exit $?
}


# func_enable_tag TAGNAME
# -----------------------
# Verify that TAGNAME is valid, and either flag an error and exit, or
# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
# variable here.
func_enable_tag ()
{
    # Global variable:
    tagname=$1

    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
    sed_extractcf=/$re_begincf/,/$re_endcf/p

    # Validate tagname.
    case $tagname in
      *[!-_A-Za-z0-9,/]*)
        func_fatal_error "invalid tag name: $tagname"
        ;;
    esac

    # Don't test for the "default" C tag, as we know it's
    # there but not specially marked.
    case $tagname in
        CC) ;;
    *)
        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
	  taglist="$taglist $tagname"

	  # Evaluate the configuration.  Be careful to quote the path
	  # and the sed script, to avoid splitting on whitespace, but
	  # also don't use non-portable quotes within backquotes within
	  # quotes we have to do it in 2 steps:
	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
	  eval "$extractedcf"
        else
	  func_error "ignoring unknown tag $tagname"
        fi
        ;;
    esac
}


# func_check_version_match
# ------------------------
# Ensure that we are using m4 macros, and libtool script from the same
# release of libtool.
func_check_version_match ()
{
    if test "$package_revision" != "$macro_revision"; then
      if test "$VERSION" != "$macro_version"; then
        if test -z "$macro_version"; then
          cat >&2 <<_LT_EOF
$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
$progname: definition of this LT_INIT comes from an older release.
$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
$progname: and run autoconf again.
_LT_EOF
        else
          cat >&2 <<_LT_EOF
$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
$progname: and run autoconf again.
_LT_EOF
        fi
      else
        cat >&2 <<_LT_EOF
$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
$progname: but the definition of this LT_INIT comes from revision $macro_revision.
$progname: You should recreate aclocal.m4 with macros from revision $package_revision
$progname: of $PACKAGE $VERSION and run autoconf again.
_LT_EOF
      fi

      exit $EXIT_MISMATCH
    fi
}


# libtool_options_prep [ARG]...
# -----------------------------
# Preparation for options parsed by libtool.
libtool_options_prep ()
{
    $debug_mode

    # Option defaults:
    opt_config=false
    opt_dlopen=
    opt_dry_run=false
    opt_help=false
    opt_mode=
    opt_preserve_dup_deps=false
    opt_quiet=false

    nonopt=
    preserve_args=

    # Shorthand for --mode=foo, only valid as the first argument
    case $1 in
    clean|clea|cle|cl)
      shift; set dummy --mode clean ${1+"$@"}; shift
      ;;
    compile|compil|compi|comp|com|co|c)
      shift; set dummy --mode compile ${1+"$@"}; shift
      ;;
    execute|execut|execu|exec|exe|ex|e)
      shift; set dummy --mode execute ${1+"$@"}; shift
      ;;
    finish|finis|fini|fin|fi|f)
      shift; set dummy --mode finish ${1+"$@"}; shift
      ;;
    install|instal|insta|inst|ins|in|i)
      shift; set dummy --mode install ${1+"$@"}; shift
      ;;
    link|lin|li|l)
      shift; set dummy --mode link ${1+"$@"}; shift
      ;;
    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
      shift; set dummy --mode uninstall ${1+"$@"}; shift
      ;;
    esac

    # Pass back the list of options.
    func_quote_for_eval ${1+"$@"}
    libtool_options_prep_result=$func_quote_for_eval_result
}
func_add_hook func_options_prep libtool_options_prep


# libtool_parse_options [ARG]...
# ---------------------------------
# Provide handling for libtool specific options.
libtool_parse_options ()
{
    $debug_cmd

    # Perform our own loop to consume as many options as possible in
    # each iteration.
    while test $# -gt 0; do
      _G_opt=$1
      shift
      case $_G_opt in
        --dry-run|--dryrun|-n)
                        opt_dry_run=:
                        ;;

        --config)       func_config ;;

        --dlopen|-dlopen)
                        opt_dlopen="${opt_dlopen+$opt_dlopen
}$1"
                        shift
                        ;;

        --preserve-dup-deps)
                        opt_preserve_dup_deps=: ;;

        --features)     func_features ;;

        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;

        --help)         opt_help=: ;;

        --help-all)     opt_help=': help-all' ;;

        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
                        opt_mode=$1
                        case $1 in
                          # Valid mode arguments:
                          clean|compile|execute|finish|install|link|relink|uninstall) ;;

                          # Catch anything else as an error
                          *) func_error "invalid argument for $_G_opt"
                             exit_cmd=exit
                             break
                             ;;
                        esac
                        shift
                        ;;

        --no-silent|--no-quiet)
                        opt_quiet=false
                        func_append preserve_args " $_G_opt"
                        ;;

        --no-warnings|--no-warning|--no-warn)
                        opt_warning=false
                        func_append preserve_args " $_G_opt"
                        ;;

        --no-verbose)
                        opt_verbose=false
                        func_append preserve_args " $_G_opt"
                        ;;

        --silent|--quiet)
                        opt_quiet=:
                        opt_verbose=false
                        func_append preserve_args " $_G_opt"
                        ;;

        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
                        opt_tag=$1
                        func_append preserve_args " $_G_opt $1"
                        func_enable_tag "$1"
                        shift
                        ;;

        --verbose|-v)   opt_quiet=false
                        opt_verbose=:
                        func_append preserve_args " $_G_opt"
                        ;;

	# An option not handled by this hook function:
        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
      esac
    done


    # save modified positional parameters for caller
    func_quote_for_eval ${1+"$@"}
    libtool_parse_options_result=$func_quote_for_eval_result
}
func_add_hook func_parse_options libtool_parse_options



# libtool_validate_options [ARG]...
# ---------------------------------
# Perform any sanity checks on option settings and/or unconsumed
# arguments.
libtool_validate_options ()
{
    # save first non-option argument
    if test 0 -lt $#; then
      nonopt=$1
      shift
    fi

    # preserve --debug
    test : = "$debug_cmd" || func_append preserve_args " --debug"

    case $host in
      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
        # don't eliminate duplications in $postdeps and $predeps
        opt_duplicate_compiler_generated_deps=:
        ;;
      *)
        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
        ;;
    esac

    $opt_help || {
      # Sanity checks first:
      func_check_version_match

      test yes != "$build_libtool_libs" \
        && test yes != "$build_old_libs" \
        && func_fatal_configuration "not configured to build any kind of library"

      # Darwin sucks
      eval std_shrext=\"$shrext_cmds\"

      # Only execute mode is allowed to have -dlopen flags.
      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
        func_error "unrecognized option '-dlopen'"
        $ECHO "$help" 1>&2
        exit $EXIT_FAILURE
      fi

      # Change the help message to a mode-specific one.
      generic_help=$help
      help="Try '$progname --help --mode=$opt_mode' for more information."
    }

    # Pass back the unparsed argument list
    func_quote_for_eval ${1+"$@"}
    libtool_validate_options_result=$func_quote_for_eval_result
}
func_add_hook func_validate_options libtool_validate_options


# Process options as early as possible so that --help and --version
# can return quickly.
func_options ${1+"$@"}
eval set dummy "$func_options_result"; shift



## ----------- ##
##    Main.    ##
## ----------- ##

magic='%%%MAGIC variable%%%'
magic_exe='%%%MAGIC EXE variable%%%'

# Global variables.
extracted_archives=
extracted_serial=0

# If this variable is set in any of the actions, the command in it
# will be execed at the end.  This prevents here-documents from being
# left over by shells.
exec_cmd=


# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}

# func_generated_by_libtool
# True iff stdin has been generated by Libtool. This function is only
# a basic sanity check; it will hardly flush out determined imposters.
func_generated_by_libtool_p ()
{
  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
}

# func_lalib_p file
# True iff FILE is a libtool '.la' library or '.lo' object file.
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_lalib_p ()
{
    test -f "$1" &&
      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
}

# func_lalib_unsafe_p file
# True iff FILE is a libtool '.la' library or '.lo' object file.
# This function implements the same check as func_lalib_p without
# resorting to external programs.  To this end, it redirects stdin and
# closes it afterwards, without saving the original file descriptor.
# As a safety measure, use it only where a negative result would be
# fatal anyway.  Works if 'file' does not exist.
func_lalib_unsafe_p ()
{
    lalib_p=no
    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
	for lalib_p_l in 1 2 3 4
	do
	    read lalib_p_line
	    case $lalib_p_line in
		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
	    esac
	done
	exec 0<&5 5<&-
    fi
    test yes = "$lalib_p"
}

# func_ltwrapper_script_p file
# True iff FILE is a libtool wrapper script
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_ltwrapper_script_p ()
{
    test -f "$1" &&
      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
}

# func_ltwrapper_executable_p file
# True iff FILE is a libtool wrapper executable
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_ltwrapper_executable_p ()
{
    func_ltwrapper_exec_suffix=
    case $1 in
    *.exe) ;;
    *) func_ltwrapper_exec_suffix=.exe ;;
    esac
    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
}

# func_ltwrapper_scriptname file
# Assumes file is an ltwrapper_executable
# uses $file to determine the appropriate filename for a
# temporary ltwrapper_script.
func_ltwrapper_scriptname ()
{
    func_dirname_and_basename "$1" "" "."
    func_stripname '' '.exe' "$func_basename_result"
    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
}

# func_ltwrapper_p file
# True iff FILE is a libtool wrapper script or wrapper executable
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_ltwrapper_p ()
{
    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
}


# func_execute_cmds commands fail_cmd
# Execute tilde-delimited COMMANDS.
# If FAIL_CMD is given, eval that upon failure.
# FAIL_CMD may read-access the current command in variable CMD!
func_execute_cmds ()
{
    $debug_cmd

    save_ifs=$IFS; IFS='~'
    for cmd in $1; do
      IFS=$sp$nl
      eval cmd=\"$cmd\"
      IFS=$save_ifs
      func_show_eval "$cmd" "${2-:}"
    done
    IFS=$save_ifs
}


# func_source file
# Source FILE, adding directory component if necessary.
# Note that it is not necessary on cygwin/mingw to append a dot to
# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
# behavior happens only for exec(3), not for open(2)!  Also, sourcing
# 'FILE.' does not work on cygwin managed mounts.
func_source ()
{
    $debug_cmd

    case $1 in
    */* | *\\*)	. "$1" ;;
    *)		. "./$1" ;;
    esac
}


# func_resolve_sysroot PATH
# Replace a leading = in PATH with a sysroot.  Store the result into
# func_resolve_sysroot_result
func_resolve_sysroot ()
{
  func_resolve_sysroot_result=$1
  case $func_resolve_sysroot_result in
  =*)
    func_stripname '=' '' "$func_resolve_sysroot_result"
    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
    ;;
  esac
}

# func_replace_sysroot PATH
# If PATH begins with the sysroot, replace it with = and
# store the result into func_replace_sysroot_result.
func_replace_sysroot ()
{
  case $lt_sysroot:$1 in
  ?*:"$lt_sysroot"*)
    func_stripname "$lt_sysroot" '' "$1"
    func_replace_sysroot_result='='$func_stripname_result
    ;;
  *)
    # Including no sysroot.
    func_replace_sysroot_result=$1
    ;;
  esac
}

# func_infer_tag arg
# Infer tagged configuration to use if any are available and
# if one wasn't chosen via the "--tag" command line option.
# Only attempt this if the compiler in the base compile
# command doesn't match the default compiler.
# arg is usually of the form 'gcc ...'
func_infer_tag ()
{
    $debug_cmd

    if test -n "$available_tags" && test -z "$tagname"; then
      CC_quoted=
      for arg in $CC; do
	func_append_quoted CC_quoted "$arg"
      done
      CC_expanded=`func_echo_all $CC`
      CC_quoted_expanded=`func_echo_all $CC_quoted`
      case $@ in
      # Blanks in the command may have been stripped by the calling shell,
      # but not from the CC environment variable when configure was run.
      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
      # Blanks at the start of $base_compile will cause this to fail
      # if we don't check for them as well.
      *)
	for z in $available_tags; do
	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
	    # Evaluate the configuration.
	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
	    CC_quoted=
	    for arg in $CC; do
	      # Double-quote args containing other shell metacharacters.
	      func_append_quoted CC_quoted "$arg"
	    done
	    CC_expanded=`func_echo_all $CC`
	    CC_quoted_expanded=`func_echo_all $CC_quoted`
	    case "$@ " in
	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
	      # The compiler in the base compile command matches
	      # the one in the tagged configuration.
	      # Assume this is the tagged configuration we want.
	      tagname=$z
	      break
	      ;;
	    esac
	  fi
	done
	# If $tagname still isn't set, then no tagged configuration
	# was found and let the user know that the "--tag" command
	# line option must be used.
	if test -z "$tagname"; then
	  func_echo "unable to infer tagged configuration"
	  func_fatal_error "specify a tag with '--tag'"
#	else
#	  func_verbose "using $tagname tagged configuration"
	fi
	;;
      esac
    fi
}



# func_write_libtool_object output_name pic_name nonpic_name
# Create a libtool object file (analogous to a ".la" file),
# but don't create it if we're doing a dry run.
func_write_libtool_object ()
{
    write_libobj=$1
    if test yes = "$build_libtool_libs"; then
      write_lobj=\'$2\'
    else
      write_lobj=none
    fi

    if test yes = "$build_old_libs"; then
      write_oldobj=\'$3\'
    else
      write_oldobj=none
    fi

    $opt_dry_run || {
      cat >${write_libobj}T <<EOF
# $write_libobj - a libtool object file
# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# Name of the PIC object.
pic_object=$write_lobj

# Name of the non-PIC object
non_pic_object=$write_oldobj

EOF
      $MV "${write_libobj}T" "$write_libobj"
    }
}


##################################################
# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
##################################################

# func_convert_core_file_wine_to_w32 ARG
# Helper function used by file name conversion functions when $build is *nix,
# and $host is mingw, cygwin, or some other w32 environment. Relies on a
# correctly configured wine environment available, with the winepath program
# in $build's $PATH.
#
# ARG is the $build file name to be converted to w32 format.
# Result is available in $func_convert_core_file_wine_to_w32_result, and will
# be empty on error (or when ARG is empty)
func_convert_core_file_wine_to_w32 ()
{
  $debug_cmd

  func_convert_core_file_wine_to_w32_result=$1
  if test -n "$1"; then
    # Unfortunately, winepath does not exit with a non-zero error code, so we
    # are forced to check the contents of stdout. On the other hand, if the
    # command is not found, the shell will set an exit code of 127 and print
    # *an error message* to stdout. So we must check for both error code of
    # zero AND non-empty stdout, which explains the odd construction:
    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
        $SED -e "$sed_naive_backslashify"`
    else
      func_convert_core_file_wine_to_w32_result=
    fi
  fi
}
# end: func_convert_core_file_wine_to_w32


# func_convert_core_path_wine_to_w32 ARG
# Helper function used by path conversion functions when $build is *nix, and
# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
# configured wine environment available, with the winepath program in $build's
# $PATH. Assumes ARG has no leading or trailing path separator characters.
#
# ARG is path to be converted from $build format to win32.
# Result is available in $func_convert_core_path_wine_to_w32_result.
# Unconvertible file (directory) names in ARG are skipped; if no directory names
# are convertible, then the result may be empty.
func_convert_core_path_wine_to_w32 ()
{
  $debug_cmd

  # unfortunately, winepath doesn't convert paths, only file names
  func_convert_core_path_wine_to_w32_result=
  if test -n "$1"; then
    oldIFS=$IFS
    IFS=:
    for func_convert_core_path_wine_to_w32_f in $1; do
      IFS=$oldIFS
      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
      if test -n "$func_convert_core_file_wine_to_w32_result"; then
        if test -z "$func_convert_core_path_wine_to_w32_result"; then
          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
        else
          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
        fi
      fi
    done
    IFS=$oldIFS
  fi
}
# end: func_convert_core_path_wine_to_w32


# func_cygpath ARGS...
# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
# (2), returns the Cygwin file name or path in func_cygpath_result (input
# file name or path is assumed to be in w32 format, as previously converted
# from $build's *nix or MSYS format). In case (3), returns the w32 file name
# or path in func_cygpath_result (input file name or path is assumed to be in
# Cygwin format). Returns an empty string on error.
#
# ARGS are passed to cygpath, with the last one being the file name or path to
# be converted.
#
# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
# environment variable; do not put it in $PATH.
func_cygpath ()
{
  $debug_cmd

  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
    if test "$?" -ne 0; then
      # on failure, ensure result is empty
      func_cygpath_result=
    fi
  else
    func_cygpath_result=
    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
  fi
}
#end: func_cygpath


# func_convert_core_msys_to_w32 ARG
# Convert file name or path ARG from MSYS format to w32 format.  Return
# result in func_convert_core_msys_to_w32_result.
func_convert_core_msys_to_w32 ()
{
  $debug_cmd

  # awkward: cmd appends spaces to result
  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
}
#end: func_convert_core_msys_to_w32


# func_convert_file_check ARG1 ARG2
# Verify that ARG1 (a file name in $build format) was converted to $host
# format in ARG2. Otherwise, emit an error message, but continue (resetting
# func_to_host_file_result to ARG1).
func_convert_file_check ()
{
  $debug_cmd

  if test -z "$2" && test -n "$1"; then
    func_error "Could not determine host file name corresponding to"
    func_error "  '$1'"
    func_error "Continuing, but uninstalled executables may not work."
    # Fallback:
    func_to_host_file_result=$1
  fi
}
# end func_convert_file_check


# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
# Verify that FROM_PATH (a path in $build format) was converted to $host
# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
# func_to_host_file_result to a simplistic fallback value (see below).
func_convert_path_check ()
{
  $debug_cmd

  if test -z "$4" && test -n "$3"; then
    func_error "Could not determine the host path corresponding to"
    func_error "  '$3'"
    func_error "Continuing, but uninstalled executables may not work."
    # Fallback.  This is a deliberately simplistic "conversion" and
    # should not be "improved".  See libtool.info.
    if test "x$1" != "x$2"; then
      lt_replace_pathsep_chars="s|$1|$2|g"
      func_to_host_path_result=`echo "$3" |
        $SED -e "$lt_replace_pathsep_chars"`
    else
      func_to_host_path_result=$3
    fi
  fi
}
# end func_convert_path_check


# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
# and appending REPL if ORIG matches BACKPAT.
func_convert_path_front_back_pathsep ()
{
  $debug_cmd

  case $4 in
  $1 ) func_to_host_path_result=$3$func_to_host_path_result
    ;;
  esac
  case $4 in
  $2 ) func_append func_to_host_path_result "$3"
    ;;
  esac
}
# end func_convert_path_front_back_pathsep


##################################################
# $build to $host FILE NAME CONVERSION FUNCTIONS #
##################################################
# invoked via '$to_host_file_cmd ARG'
#
# In each case, ARG is the path to be converted from $build to $host format.
# Result will be available in $func_to_host_file_result.


# func_to_host_file ARG
# Converts the file name ARG from $build format to $host format. Return result
# in func_to_host_file_result.
func_to_host_file ()
{
  $debug_cmd

  $to_host_file_cmd "$1"
}
# end func_to_host_file


# func_to_tool_file ARG LAZY
# converts the file name ARG from $build format to toolchain format. Return
# result in func_to_tool_file_result.  If the conversion in use is listed
# in (the comma separated) LAZY, no conversion takes place.
func_to_tool_file ()
{
  $debug_cmd

  case ,$2, in
    *,"$to_tool_file_cmd",*)
      func_to_tool_file_result=$1
      ;;
    *)
      $to_tool_file_cmd "$1"
      func_to_tool_file_result=$func_to_host_file_result
      ;;
  esac
}
# end func_to_tool_file


# func_convert_file_noop ARG
# Copy ARG to func_to_host_file_result.
func_convert_file_noop ()
{
  func_to_host_file_result=$1
}
# end func_convert_file_noop


# func_convert_file_msys_to_w32 ARG
# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
# conversion to w32 is not available inside the cwrapper.  Returns result in
# func_to_host_file_result.
func_convert_file_msys_to_w32 ()
{
  $debug_cmd

  func_to_host_file_result=$1
  if test -n "$1"; then
    func_convert_core_msys_to_w32 "$1"
    func_to_host_file_result=$func_convert_core_msys_to_w32_result
  fi
  func_convert_file_check "$1" "$func_to_host_file_result"
}
# end func_convert_file_msys_to_w32


# func_convert_file_cygwin_to_w32 ARG
# Convert file name ARG from Cygwin to w32 format.  Returns result in
# func_to_host_file_result.
func_convert_file_cygwin_to_w32 ()
{
  $debug_cmd

  func_to_host_file_result=$1
  if test -n "$1"; then
    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
    # LT_CYGPATH in this case.
    func_to_host_file_result=`cygpath -m "$1"`
  fi
  func_convert_file_check "$1" "$func_to_host_file_result"
}
# end func_convert_file_cygwin_to_w32


# func_convert_file_nix_to_w32 ARG
# Convert file name ARG from *nix to w32 format.  Requires a wine environment
# and a working winepath. Returns result in func_to_host_file_result.
func_convert_file_nix_to_w32 ()
{
  $debug_cmd

  func_to_host_file_result=$1
  if test -n "$1"; then
    func_convert_core_file_wine_to_w32 "$1"
    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
  fi
  func_convert_file_check "$1" "$func_to_host_file_result"
}
# end func_convert_file_nix_to_w32


# func_convert_file_msys_to_cygwin ARG
# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
# Returns result in func_to_host_file_result.
func_convert_file_msys_to_cygwin ()
{
  $debug_cmd

  func_to_host_file_result=$1
  if test -n "$1"; then
    func_convert_core_msys_to_w32 "$1"
    func_cygpath -u "$func_convert_core_msys_to_w32_result"
    func_to_host_file_result=$func_cygpath_result
  fi
  func_convert_file_check "$1" "$func_to_host_file_result"
}
# end func_convert_file_msys_to_cygwin


# func_convert_file_nix_to_cygwin ARG
# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
# in func_to_host_file_result.
func_convert_file_nix_to_cygwin ()
{
  $debug_cmd

  func_to_host_file_result=$1
  if test -n "$1"; then
    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
    func_convert_core_file_wine_to_w32 "$1"
    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
    func_to_host_file_result=$func_cygpath_result
  fi
  func_convert_file_check "$1" "$func_to_host_file_result"
}
# end func_convert_file_nix_to_cygwin


#############################################
# $build to $host PATH CONVERSION FUNCTIONS #
#############################################
# invoked via '$to_host_path_cmd ARG'
#
# In each case, ARG is the path to be converted from $build to $host format.
# The result will be available in $func_to_host_path_result.
#
# Path separators are also converted from $build format to $host format.  If
# ARG begins or ends with a path separator character, it is preserved (but
# converted to $host format) on output.
#
# All path conversion functions are named using the following convention:
#   file name conversion function    : func_convert_file_X_to_Y ()
#   path conversion function         : func_convert_path_X_to_Y ()
# where, for any given $build/$host combination the 'X_to_Y' value is the
# same.  If conversion functions are added for new $build/$host combinations,
# the two new functions must follow this pattern, or func_init_to_host_path_cmd
# will break.


# func_init_to_host_path_cmd
# Ensures that function "pointer" variable $to_host_path_cmd is set to the
# appropriate value, based on the value of $to_host_file_cmd.
to_host_path_cmd=
func_init_to_host_path_cmd ()
{
  $debug_cmd

  if test -z "$to_host_path_cmd"; then
    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
    to_host_path_cmd=func_convert_path_$func_stripname_result
  fi
}


# func_to_host_path ARG
# Converts the path ARG from $build format to $host format. Return result
# in func_to_host_path_result.
func_to_host_path ()
{
  $debug_cmd

  func_init_to_host_path_cmd
  $to_host_path_cmd "$1"
}
# end func_to_host_path


# func_convert_path_noop ARG
# Copy ARG to func_to_host_path_result.
func_convert_path_noop ()
{
  func_to_host_path_result=$1
}
# end func_convert_path_noop


# func_convert_path_msys_to_w32 ARG
# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
# conversion to w32 is not available inside the cwrapper.  Returns result in
# func_to_host_path_result.
func_convert_path_msys_to_w32 ()
{
  $debug_cmd

  func_to_host_path_result=$1
  if test -n "$1"; then
    # Remove leading and trailing path separator characters from ARG.  MSYS
    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
    # and winepath ignores them completely.
    func_stripname : : "$1"
    func_to_host_path_tmp1=$func_stripname_result
    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
    func_to_host_path_result=$func_convert_core_msys_to_w32_result
    func_convert_path_check : ";" \
      "$func_to_host_path_tmp1" "$func_to_host_path_result"
    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
  fi
}
# end func_convert_path_msys_to_w32


# func_convert_path_cygwin_to_w32 ARG
# Convert path ARG from Cygwin to w32 format.  Returns result in
# func_to_host_file_result.
func_convert_path_cygwin_to_w32 ()
{
  $debug_cmd

  func_to_host_path_result=$1
  if test -n "$1"; then
    # See func_convert_path_msys_to_w32:
    func_stripname : : "$1"
    func_to_host_path_tmp1=$func_stripname_result
    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
    func_convert_path_check : ";" \
      "$func_to_host_path_tmp1" "$func_to_host_path_result"
    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
  fi
}
# end func_convert_path_cygwin_to_w32


# func_convert_path_nix_to_w32 ARG
# Convert path ARG from *nix to w32 format.  Requires a wine environment and
# a working winepath.  Returns result in func_to_host_file_result.
func_convert_path_nix_to_w32 ()
{
  $debug_cmd

  func_to_host_path_result=$1
  if test -n "$1"; then
    # See func_convert_path_msys_to_w32:
    func_stripname : : "$1"
    func_to_host_path_tmp1=$func_stripname_result
    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
    func_convert_path_check : ";" \
      "$func_to_host_path_tmp1" "$func_to_host_path_result"
    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
  fi
}
# end func_convert_path_nix_to_w32


# func_convert_path_msys_to_cygwin ARG
# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
# Returns result in func_to_host_file_result.
func_convert_path_msys_to_cygwin ()
{
  $debug_cmd

  func_to_host_path_result=$1
  if test -n "$1"; then
    # See func_convert_path_msys_to_w32:
    func_stripname : : "$1"
    func_to_host_path_tmp1=$func_stripname_result
    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
    func_to_host_path_result=$func_cygpath_result
    func_convert_path_check : : \
      "$func_to_host_path_tmp1" "$func_to_host_path_result"
    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
  fi
}
# end func_convert_path_msys_to_cygwin


# func_convert_path_nix_to_cygwin ARG
# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
# func_to_host_file_result.
func_convert_path_nix_to_cygwin ()
{
  $debug_cmd

  func_to_host_path_result=$1
  if test -n "$1"; then
    # Remove leading and trailing path separator characters from
    # ARG. msys behavior is inconsistent here, cygpath turns them
    # into '.;' and ';.', and winepath ignores them completely.
    func_stripname : : "$1"
    func_to_host_path_tmp1=$func_stripname_result
    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
    func_to_host_path_result=$func_cygpath_result
    func_convert_path_check : : \
      "$func_to_host_path_tmp1" "$func_to_host_path_result"
    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
  fi
}
# end func_convert_path_nix_to_cygwin


# func_dll_def_p FILE
# True iff FILE is a Windows DLL '.def' file.
# Keep in sync with _LT_DLL_DEF_P in libtool.m4
func_dll_def_p ()
{
  $debug_cmd

  func_dll_def_p_tmp=`$SED -n \
    -e 's/^[	 ]*//' \
    -e '/^\(;.*\)*$/d' \
    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
    -e q \
    "$1"`
  test DEF = "$func_dll_def_p_tmp"
}


# func_mode_compile arg...
func_mode_compile ()
{
    $debug_cmd

    # Get the compilation command and the source file.
    base_compile=
    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
    suppress_opt=yes
    suppress_output=
    arg_mode=normal
    libobj=
    later=
    pie_flag=

    for arg
    do
      case $arg_mode in
      arg  )
	# do not "continue".  Instead, add this to base_compile
	lastarg=$arg
	arg_mode=normal
	;;

      target )
	libobj=$arg
	arg_mode=normal
	continue
	;;

      normal )
	# Accept any command-line options.
	case $arg in
	-o)
	  test -n "$libobj" && \
	    func_fatal_error "you cannot specify '-o' more than once"
	  arg_mode=target
	  continue
	  ;;

	-pie | -fpie | -fPIE)
          func_append pie_flag " $arg"
	  continue
	  ;;

	-shared | -static | -prefer-pic | -prefer-non-pic)
	  func_append later " $arg"
	  continue
	  ;;

	-no-suppress)
	  suppress_opt=no
	  continue
	  ;;

	-Xcompiler)
	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
	  continue      #  The current "srcfile" will either be retained or
	  ;;            #  replaced later.  I would guess that would be a bug.

	-Wc,*)
	  func_stripname '-Wc,' '' "$arg"
	  args=$func_stripname_result
	  lastarg=
	  save_ifs=$IFS; IFS=,
	  for arg in $args; do
	    IFS=$save_ifs
	    func_append_quoted lastarg "$arg"
	  done
	  IFS=$save_ifs
	  func_stripname ' ' '' "$lastarg"
	  lastarg=$func_stripname_result

	  # Add the arguments to base_compile.
	  func_append base_compile " $lastarg"
	  continue
	  ;;

	*)
	  # Accept the current argument as the source file.
	  # The previous "srcfile" becomes the current argument.
	  #
	  lastarg=$srcfile
	  srcfile=$arg
	  ;;
	esac  #  case $arg
	;;
      esac    #  case $arg_mode

      # Aesthetically quote the previous argument.
      func_append_quoted base_compile "$lastarg"
    done # for arg

    case $arg_mode in
    arg)
      func_fatal_error "you must specify an argument for -Xcompile"
      ;;
    target)
      func_fatal_error "you must specify a target with '-o'"
      ;;
    *)
      # Get the name of the library object.
      test -z "$libobj" && {
	func_basename "$srcfile"
	libobj=$func_basename_result
      }
      ;;
    esac

    # Recognize several different file suffixes.
    # If the user specifies -o file.o, it is replaced with file.lo
    case $libobj in
    *.[cCFSifmso] | \
    *.ada | *.adb | *.ads | *.asm | \
    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
      func_xform "$libobj"
      libobj=$func_xform_result
      ;;
    esac

    case $libobj in
    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
    *)
      func_fatal_error "cannot determine name of library object from '$libobj'"
      ;;
    esac

    func_infer_tag $base_compile

    for arg in $later; do
      case $arg in
      -shared)
	test yes = "$build_libtool_libs" \
	  || func_fatal_configuration "cannot build a shared library"
	build_old_libs=no
	continue
	;;

      -static)
	build_libtool_libs=no
	build_old_libs=yes
	continue
	;;

      -prefer-pic)
	pic_mode=yes
	continue
	;;

      -prefer-non-pic)
	pic_mode=no
	continue
	;;
      esac
    done

    func_quote_for_eval "$libobj"
    test "X$libobj" != "X$func_quote_for_eval_result" \
      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
      && func_warning "libobj name '$libobj' may not contain shell special characters."
    func_dirname_and_basename "$obj" "/" ""
    objname=$func_basename_result
    xdir=$func_dirname_result
    lobj=$xdir$objdir/$objname

    test -z "$base_compile" && \
      func_fatal_help "you must specify a compilation command"

    # Delete any leftover library objects.
    if test yes = "$build_old_libs"; then
      removelist="$obj $lobj $libobj ${libobj}T"
    else
      removelist="$lobj $libobj ${libobj}T"
    fi

    # On Cygwin there's no "real" PIC flag so we must build both object types
    case $host_os in
    cygwin* | mingw* | pw32* | os2* | cegcc*)
      pic_mode=default
      ;;
    esac
    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
      # non-PIC code in shared libraries is not supported
      pic_mode=default
    fi

    # Calculate the filename of the output object if compiler does
    # not support -o with -c
    if test no = "$compiler_c_o"; then
      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
      lockfile=$output_obj.lock
    else
      output_obj=
      need_locks=no
      lockfile=
    fi

    # Lock this critical section if it is needed
    # We use this script file to make the link, it avoids creating a new file
    if test yes = "$need_locks"; then
      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
	func_echo "Waiting for $lockfile to be removed"
	sleep 2
      done
    elif test warn = "$need_locks"; then
      if test -f "$lockfile"; then
	$ECHO "\
*** ERROR, $lockfile exists and contains:
`cat $lockfile 2>/dev/null`

This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support '-c' and '-o' together.  If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."

	$opt_dry_run || $RM $removelist
	exit $EXIT_FAILURE
      fi
      func_append removelist " $output_obj"
      $ECHO "$srcfile" > "$lockfile"
    fi

    $opt_dry_run || $RM $removelist
    func_append removelist " $lockfile"
    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15

    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
    srcfile=$func_to_tool_file_result
    func_quote_for_eval "$srcfile"
    qsrcfile=$func_quote_for_eval_result

    # Only build a PIC object if we are building libtool libraries.
    if test yes = "$build_libtool_libs"; then
      # Without this assignment, base_compile gets emptied.
      fbsd_hideous_sh_bug=$base_compile

      if test no != "$pic_mode"; then
	command="$base_compile $qsrcfile $pic_flag"
      else
	# Don't build PIC code
	command="$base_compile $qsrcfile"
      fi

      func_mkdir_p "$xdir$objdir"

      if test -z "$output_obj"; then
	# Place PIC objects in $objdir
	func_append command " -o $lobj"
      fi

      func_show_eval_locale "$command"	\
          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'

      if test warn = "$need_locks" &&
	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
	$ECHO "\
*** ERROR, $lockfile contains:
`cat $lockfile 2>/dev/null`

but it should contain:
$srcfile

This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support '-c' and '-o' together.  If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."

	$opt_dry_run || $RM $removelist
	exit $EXIT_FAILURE
      fi

      # Just move the object if needed, then go on to compile the next one
      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
	func_show_eval '$MV "$output_obj" "$lobj"' \
	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
      fi

      # Allow error messages only from the first compilation.
      if test yes = "$suppress_opt"; then
	suppress_output=' >/dev/null 2>&1'
      fi
    fi

    # Only build a position-dependent object if we build old libraries.
    if test yes = "$build_old_libs"; then
      if test yes != "$pic_mode"; then
	# Don't build PIC code
	command="$base_compile $qsrcfile$pie_flag"
      else
	command="$base_compile $qsrcfile $pic_flag"
      fi
      if test yes = "$compiler_c_o"; then
	func_append command " -o $obj"
      fi

      # Suppress compiler output if we already did a PIC compilation.
      func_append command "$suppress_output"
      func_show_eval_locale "$command" \
        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'

      if test warn = "$need_locks" &&
	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
	$ECHO "\
*** ERROR, $lockfile contains:
`cat $lockfile 2>/dev/null`

but it should contain:
$srcfile

This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support '-c' and '-o' together.  If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."

	$opt_dry_run || $RM $removelist
	exit $EXIT_FAILURE
      fi

      # Just move the object if needed
      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
	func_show_eval '$MV "$output_obj" "$obj"' \
	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
      fi
    fi

    $opt_dry_run || {
      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"

      # Unlock the critical section if it was locked
      if test no != "$need_locks"; then
	removelist=$lockfile
        $RM "$lockfile"
      fi
    }

    exit $EXIT_SUCCESS
}

$opt_help || {
  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
}

func_mode_help ()
{
    # We need to display help for each of the modes.
    case $opt_mode in
      "")
        # Generic help is extracted from the usage comments
        # at the start of this file.
        func_help
        ;;

      clean)
        $ECHO \
"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...

Remove files from the build directory.

RM is the name of the program to use to delete files associated with each FILE
(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
to RM.

If FILE is a libtool library, object or program, all the files associated
with it are deleted. Otherwise, only FILE itself is deleted using RM."
        ;;

      compile)
      $ECHO \
"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE

Compile a source file into a libtool library object.

This mode accepts the following additional options:

  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
  -no-suppress      do not suppress compiler output for multiple passes
  -prefer-pic       try to build PIC objects only
  -prefer-non-pic   try to build non-PIC objects only
  -shared           do not build a '.o' file suitable for static linking
  -static           only build a '.o' file suitable for static linking
  -Wc,FLAG          pass FLAG directly to the compiler

COMPILE-COMMAND is a command to be used in creating a 'standard' object file
from the given SOURCEFILE.

The output file name is determined by removing the directory component from
SOURCEFILE, then substituting the C source code suffix '.c' with the
library object suffix, '.lo'."
        ;;

      execute)
        $ECHO \
"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...

Automatically set library path, then run a program.

This mode accepts the following additional options:

  -dlopen FILE      add the directory containing FILE to the library path

This mode sets the library path environment variable according to '-dlopen'
flags.

If any of the ARGS are libtool executable wrappers, then they are translated
into their corresponding uninstalled binary, and any of their required library
directories are added to the library path.

Then, COMMAND is executed, with ARGS as arguments."
        ;;

      finish)
        $ECHO \
"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...

Complete the installation of libtool libraries.

Each LIBDIR is a directory that contains libtool libraries.

The commands that this mode executes may require superuser privileges.  Use
the '--dry-run' option if you just want to see what would be executed."
        ;;

      install)
        $ECHO \
"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...

Install executables or libraries.

INSTALL-COMMAND is the installation command.  The first component should be
either the 'install' or 'cp' program.

The following components of INSTALL-COMMAND are treated specially:

  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation

The rest of the components are interpreted as arguments to that command (only
BSD-compatible install options are recognized)."
        ;;

      link)
        $ECHO \
"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...

Link object files or libraries together to form another library, or to
create an executable program.

LINK-COMMAND is a command using the C compiler that you would use to create
a program from several object files.

The following components of LINK-COMMAND are treated specially:

  -all-static       do not do any dynamic linking at all
  -avoid-version    do not add a version suffix if possible
  -bindir BINDIR    specify path to binaries directory (for systems where
                    libraries must be found in the PATH setting at runtime)
  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
  -export-symbols SYMFILE
                    try to export only the symbols listed in SYMFILE
  -export-symbols-regex REGEX
                    try to export only the symbols matching REGEX
  -LLIBDIR          search LIBDIR for required installed libraries
  -lNAME            OUTPUT-FILE requires the installed library libNAME
  -module           build a library that can dlopened
  -no-fast-install  disable the fast-install mode
  -no-install       link a not-installable executable
  -no-undefined     declare that a library does not refer to external symbols
  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
  -objectlist FILE  use a list of object files found in FILE to specify objects
  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
  -precious-files-regex REGEX
                    don't remove output files matching REGEX
  -release RELEASE  specify package release information
  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
  -shared           only do dynamic linking of libtool libraries
  -shrext SUFFIX    override the standard shared library file extension
  -static           do not do any dynamic linking of uninstalled libtool libraries
  -static-libtool-libs
                    do not do any dynamic linking of libtool libraries
  -version-info CURRENT[:REVISION[:AGE]]
                    specify library version info [each variable defaults to 0]
  -weak LIBNAME     declare that the target provides the LIBNAME interface
  -Wc,FLAG
  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
  -Wl,FLAG
  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)

All other options (arguments beginning with '-') are ignored.

Every other argument is treated as a filename.  Files ending in '.la' are
treated as uninstalled libtool libraries, other files are standard or library
object files.

If the OUTPUT-FILE ends in '.la', then a libtool library is created,
only library objects ('.lo' files) may be specified, and '-rpath' is
required, except when creating a convenience library.

If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
using 'ar' and 'ranlib', or on Windows using 'lib'.

If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
is created, otherwise an executable program is created."
        ;;

      uninstall)
        $ECHO \
"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...

Remove libraries from an installation directory.

RM is the name of the program to use to delete files associated with each FILE
(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
to RM.

If FILE is a libtool library, all the files associated with it are deleted.
Otherwise, only FILE itself is deleted using RM."
        ;;

      *)
        func_fatal_help "invalid operation mode '$opt_mode'"
        ;;
    esac

    echo
    $ECHO "Try '$progname --help' for more information about other modes."
}

# Now that we've collected a possible --mode arg, show help if necessary
if $opt_help; then
  if test : = "$opt_help"; then
    func_mode_help
  else
    {
      func_help noexit
      for opt_mode in compile link execute install finish uninstall clean; do
	func_mode_help
      done
    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
    {
      func_help noexit
      for opt_mode in compile link execute install finish uninstall clean; do
	echo
	func_mode_help
      done
    } |
    $SED '1d
      /^When reporting/,/^Report/{
	H
	d
      }
      $x
      /information about other modes/d
      /more detailed .*MODE/d
      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
  fi
  exit $?
fi


# func_mode_execute arg...
func_mode_execute ()
{
    $debug_cmd

    # The first argument is the command name.
    cmd=$nonopt
    test -z "$cmd" && \
      func_fatal_help "you must specify a COMMAND"

    # Handle -dlopen flags immediately.
    for file in $opt_dlopen; do
      test -f "$file" \
	|| func_fatal_help "'$file' is not a file"

      dir=
      case $file in
      *.la)
	func_resolve_sysroot "$file"
	file=$func_resolve_sysroot_result

	# Check to see that this really is a libtool archive.
	func_lalib_unsafe_p "$file" \
	  || func_fatal_help "'$lib' is not a valid libtool archive"

	# Read the libtool library.
	dlname=
	library_names=
	func_source "$file"

	# Skip this library if it cannot be dlopened.
	if test -z "$dlname"; then
	  # Warn if it was a shared library.
	  test -n "$library_names" && \
	    func_warning "'$file' was not linked with '-export-dynamic'"
	  continue
	fi

	func_dirname "$file" "" "."
	dir=$func_dirname_result

	if test -f "$dir/$objdir/$dlname"; then
	  func_append dir "/$objdir"
	else
	  if test ! -f "$dir/$dlname"; then
	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
	  fi
	fi
	;;

      *.lo)
	# Just add the directory containing the .lo file.
	func_dirname "$file" "" "."
	dir=$func_dirname_result
	;;

      *)
	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
	continue
	;;
      esac

      # Get the absolute pathname.
      absdir=`cd "$dir" && pwd`
      test -n "$absdir" && dir=$absdir

      # Now add the directory to shlibpath_var.
      if eval "test -z \"\$$shlibpath_var\""; then
	eval "$shlibpath_var=\"\$dir\""
      else
	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
      fi
    done

    # This variable tells wrapper scripts just to set shlibpath_var
    # rather than running their programs.
    libtool_execute_magic=$magic

    # Check if any of the arguments is a wrapper script.
    args=
    for file
    do
      case $file in
      -* | *.la | *.lo ) ;;
      *)
	# Do a test to see if this is really a libtool program.
	if func_ltwrapper_script_p "$file"; then
	  func_source "$file"
	  # Transform arg to wrapped name.
	  file=$progdir/$program
	elif func_ltwrapper_executable_p "$file"; then
	  func_ltwrapper_scriptname "$file"
	  func_source "$func_ltwrapper_scriptname_result"
	  # Transform arg to wrapped name.
	  file=$progdir/$program
	fi
	;;
      esac
      # Quote arguments (to preserve shell metacharacters).
      func_append_quoted args "$file"
    done

    if $opt_dry_run; then
      # Display what would be done.
      if test -n "$shlibpath_var"; then
	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
	echo "export $shlibpath_var"
      fi
      $ECHO "$cmd$args"
      exit $EXIT_SUCCESS
    else
      if test -n "$shlibpath_var"; then
	# Export the shlibpath_var.
	eval "export $shlibpath_var"
      fi

      # Restore saved environment variables
      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
      do
	eval "if test \"\${save_$lt_var+set}\" = set; then
                $lt_var=\$save_$lt_var; export $lt_var
	      else
		$lt_unset $lt_var
	      fi"
      done

      # Now prepare to actually exec the command.
      exec_cmd=\$cmd$args
    fi
}

test execute = "$opt_mode" && func_mode_execute ${1+"$@"}


# func_mode_finish arg...
func_mode_finish ()
{
    $debug_cmd

    libs=
    libdirs=
    admincmds=

    for opt in "$nonopt" ${1+"$@"}
    do
      if test -d "$opt"; then
	func_append libdirs " $opt"

      elif test -f "$opt"; then
	if func_lalib_unsafe_p "$opt"; then
	  func_append libs " $opt"
	else
	  func_warning "'$opt' is not a valid libtool archive"
	fi

      else
	func_fatal_error "invalid argument '$opt'"
      fi
    done

    if test -n "$libs"; then
      if test -n "$lt_sysroot"; then
        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
      else
        sysroot_cmd=
      fi

      # Remove sysroot references
      if $opt_dry_run; then
        for lib in $libs; do
          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
        done
      else
        tmpdir=`func_mktempdir`
        for lib in $libs; do
	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
	    > $tmpdir/tmp-la
	  mv -f $tmpdir/tmp-la $lib
	done
        ${RM}r "$tmpdir"
      fi
    fi

    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
      for libdir in $libdirs; do
	if test -n "$finish_cmds"; then
	  # Do each command in the finish commands.
	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
'"$cmd"'"'
	fi
	if test -n "$finish_eval"; then
	  # Do the single finish_eval.
	  eval cmds=\"$finish_eval\"
	  $opt_dry_run || eval "$cmds" || func_append admincmds "
       $cmds"
	fi
      done
    fi

    # Exit here if they wanted silent mode.
    $opt_quiet && exit $EXIT_SUCCESS

    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
      echo "----------------------------------------------------------------------"
      echo "Libraries have been installed in:"
      for libdir in $libdirs; do
	$ECHO "   $libdir"
      done
      echo
      echo "If you ever happen to want to link against installed libraries"
      echo "in a given directory, LIBDIR, you must either use libtool, and"
      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
      echo "flag during linking and do at least one of the following:"
      if test -n "$shlibpath_var"; then
	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
	echo "     during execution"
      fi
      if test -n "$runpath_var"; then
	echo "   - add LIBDIR to the '$runpath_var' environment variable"
	echo "     during linking"
      fi
      if test -n "$hardcode_libdir_flag_spec"; then
	libdir=LIBDIR
	eval flag=\"$hardcode_libdir_flag_spec\"

	$ECHO "   - use the '$flag' linker flag"
      fi
      if test -n "$admincmds"; then
	$ECHO "   - have your system administrator run these commands:$admincmds"
      fi
      if test -f /etc/ld.so.conf; then
	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
      fi
      echo

      echo "See any operating system documentation about shared libraries for"
      case $host in
	solaris2.[6789]|solaris2.1[0-9])
	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
	  echo "pages."
	  ;;
	*)
	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
	  ;;
      esac
      echo "----------------------------------------------------------------------"
    fi
    exit $EXIT_SUCCESS
}

test finish = "$opt_mode" && func_mode_finish ${1+"$@"}


# func_mode_install arg...
func_mode_install ()
{
    $debug_cmd

    # There may be an optional sh(1) argument at the beginning of
    # install_prog (especially on Windows NT).
    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
       # Allow the use of GNU shtool's install command.
       case $nonopt in *shtool*) :;; *) false;; esac
    then
      # Aesthetically quote it.
      func_quote_for_eval "$nonopt"
      install_prog="$func_quote_for_eval_result "
      arg=$1
      shift
    else
      install_prog=
      arg=$nonopt
    fi

    # The real first argument should be the name of the installation program.
    # Aesthetically quote it.
    func_quote_for_eval "$arg"
    func_append install_prog "$func_quote_for_eval_result"
    install_shared_prog=$install_prog
    case " $install_prog " in
      *[\\\ /]cp\ *) install_cp=: ;;
      *) install_cp=false ;;
    esac

    # We need to accept at least all the BSD install flags.
    dest=
    files=
    opts=
    prev=
    install_type=
    isdir=false
    stripme=
    no_mode=:
    for arg
    do
      arg2=
      if test -n "$dest"; then
	func_append files " $dest"
	dest=$arg
	continue
      fi

      case $arg in
      -d) isdir=: ;;
      -f)
	if $install_cp; then :; else
	  prev=$arg
	fi
	;;
      -g | -m | -o)
	prev=$arg
	;;
      -s)
	stripme=" -s"
	continue
	;;
      -*)
	;;
      *)
	# If the previous option needed an argument, then skip it.
	if test -n "$prev"; then
	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
	    arg2=$install_override_mode
	    no_mode=false
	  fi
	  prev=
	else
	  dest=$arg
	  continue
	fi
	;;
      esac

      # Aesthetically quote the argument.
      func_quote_for_eval "$arg"
      func_append install_prog " $func_quote_for_eval_result"
      if test -n "$arg2"; then
	func_quote_for_eval "$arg2"
      fi
      func_append install_shared_prog " $func_quote_for_eval_result"
    done

    test -z "$install_prog" && \
      func_fatal_help "you must specify an install program"

    test -n "$prev" && \
      func_fatal_help "the '$prev' option requires an argument"

    if test -n "$install_override_mode" && $no_mode; then
      if $install_cp; then :; else
	func_quote_for_eval "$install_override_mode"
	func_append install_shared_prog " -m $func_quote_for_eval_result"
      fi
    fi

    if test -z "$files"; then
      if test -z "$dest"; then
	func_fatal_help "no file or destination specified"
      else
	func_fatal_help "you must specify a destination"
      fi
    fi

    # Strip any trailing slash from the destination.
    func_stripname '' '/' "$dest"
    dest=$func_stripname_result

    # Check to see that the destination is a directory.
    test -d "$dest" && isdir=:
    if $isdir; then
      destdir=$dest
      destname=
    else
      func_dirname_and_basename "$dest" "" "."
      destdir=$func_dirname_result
      destname=$func_basename_result

      # Not a directory, so check to see that there is only one file specified.
      set dummy $files; shift
      test "$#" -gt 1 && \
	func_fatal_help "'$dest' is not a directory"
    fi
    case $destdir in
    [\\/]* | [A-Za-z]:[\\/]*) ;;
    *)
      for file in $files; do
	case $file in
	*.lo) ;;
	*)
	  func_fatal_help "'$destdir' must be an absolute directory name"
	  ;;
	esac
      done
      ;;
    esac

    # This variable tells wrapper scripts just to set variables rather
    # than running their programs.
    libtool_install_magic=$magic

    staticlibs=
    future_libdirs=
    current_libdirs=
    for file in $files; do

      # Do each installation.
      case $file in
      *.$libext)
	# Do the static libraries later.
	func_append staticlibs " $file"
	;;

      *.la)
	func_resolve_sysroot "$file"
	file=$func_resolve_sysroot_result

	# Check to see that this really is a libtool archive.
	func_lalib_unsafe_p "$file" \
	  || func_fatal_help "'$file' is not a valid libtool archive"

	library_names=
	old_library=
	relink_command=
	func_source "$file"

	# Add the libdir to current_libdirs if it is the destination.
	if test "X$destdir" = "X$libdir"; then
	  case "$current_libdirs " in
	  *" $libdir "*) ;;
	  *) func_append current_libdirs " $libdir" ;;
	  esac
	else
	  # Note the libdir as a future libdir.
	  case "$future_libdirs " in
	  *" $libdir "*) ;;
	  *) func_append future_libdirs " $libdir" ;;
	  esac
	fi

	func_dirname "$file" "/" ""
	dir=$func_dirname_result
	func_append dir "$objdir"

	if test -n "$relink_command"; then
	  # Determine the prefix the user has applied to our future dir.
	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`

	  # Don't allow the user to place us outside of our expected
	  # location b/c this prevents finding dependent libraries that
	  # are installed to the same prefix.
	  # At present, this check doesn't affect windows .dll's that
	  # are installed into $libdir/../bin (currently, that works fine)
	  # but it's something to keep an eye on.
	  test "$inst_prefix_dir" = "$destdir" && \
	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"

	  if test -n "$inst_prefix_dir"; then
	    # Stick the inst_prefix_dir data into the link command.
	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
	  else
	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
	  fi

	  func_warning "relinking '$file'"
	  func_show_eval "$relink_command" \
	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
	fi

	# See the names of the shared library.
	set dummy $library_names; shift
	if test -n "$1"; then
	  realname=$1
	  shift

	  srcname=$realname
	  test -n "$relink_command" && srcname=${realname}T

	  # Install the shared library and build the symlinks.
	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
	      'exit $?'
	  tstripme=$stripme
	  case $host_os in
	  cygwin* | mingw* | pw32* | cegcc*)
	    case $realname in
	    *.dll.a)
	      tstripme=
	      ;;
	    esac
	    ;;
	  os2*)
	    case $realname in
	    *_dll.a)
	      tstripme=
	      ;;
	    esac
	    ;;
	  esac
	  if test -n "$tstripme" && test -n "$striplib"; then
	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
	  fi

	  if test "$#" -gt 0; then
	    # Delete the old symlinks, and create new ones.
	    # Try 'ln -sf' first, because the 'ln' binary might depend on
	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
	    # so we also need to try rm && ln -s.
	    for linkname
	    do
	      test "$linkname" != "$realname" \
		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
	    done
	  fi

	  # Do each command in the postinstall commands.
	  lib=$destdir/$realname
	  func_execute_cmds "$postinstall_cmds" 'exit $?'
	fi

	# Install the pseudo-library for information purposes.
	func_basename "$file"
	name=$func_basename_result
	instname=$dir/${name}i
	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'

	# Maybe install the static library, too.
	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
	;;

      *.lo)
	# Install (i.e. copy) a libtool object.

	# Figure out destination file name, if it wasn't already specified.
	if test -n "$destname"; then
	  destfile=$destdir/$destname
	else
	  func_basename "$file"
	  destfile=$func_basename_result
	  destfile=$destdir/$destfile
	fi

	# Deduce the name of the destination old-style object file.
	case $destfile in
	*.lo)
	  func_lo2o "$destfile"
	  staticdest=$func_lo2o_result
	  ;;
	*.$objext)
	  staticdest=$destfile
	  destfile=
	  ;;
	*)
	  func_fatal_help "cannot copy a libtool object to '$destfile'"
	  ;;
	esac

	# Install the libtool object if requested.
	test -n "$destfile" && \
	  func_show_eval "$install_prog $file $destfile" 'exit $?'

	# Install the old object if enabled.
	if test yes = "$build_old_libs"; then
	  # Deduce the name of the old-style object file.
	  func_lo2o "$file"
	  staticobj=$func_lo2o_result
	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
	fi
	exit $EXIT_SUCCESS
	;;

      *)
	# Figure out destination file name, if it wasn't already specified.
	if test -n "$destname"; then
	  destfile=$destdir/$destname
	else
	  func_basename "$file"
	  destfile=$func_basename_result
	  destfile=$destdir/$destfile
	fi

	# If the file is missing, and there is a .exe on the end, strip it
	# because it is most likely a libtool script we actually want to
	# install
	stripped_ext=
	case $file in
	  *.exe)
	    if test ! -f "$file"; then
	      func_stripname '' '.exe' "$file"
	      file=$func_stripname_result
	      stripped_ext=.exe
	    fi
	    ;;
	esac

	# Do a test to see if this is really a libtool program.
	case $host in
	*cygwin* | *mingw*)
	    if func_ltwrapper_executable_p "$file"; then
	      func_ltwrapper_scriptname "$file"
	      wrapper=$func_ltwrapper_scriptname_result
	    else
	      func_stripname '' '.exe' "$file"
	      wrapper=$func_stripname_result
	    fi
	    ;;
	*)
	    wrapper=$file
	    ;;
	esac
	if func_ltwrapper_script_p "$wrapper"; then
	  notinst_deplibs=
	  relink_command=

	  func_source "$wrapper"

	  # Check the variables that should have been set.
	  test -z "$generated_by_libtool_version" && \
	    func_fatal_error "invalid libtool wrapper script '$wrapper'"

	  finalize=:
	  for lib in $notinst_deplibs; do
	    # Check to see that each library is installed.
	    libdir=
	    if test -f "$lib"; then
	      func_source "$lib"
	    fi
	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
	    if test -n "$libdir" && test ! -f "$libfile"; then
	      func_warning "'$lib' has not been installed in '$libdir'"
	      finalize=false
	    fi
	  done

	  relink_command=
	  func_source "$wrapper"

	  outputname=
	  if test no = "$fast_install" && test -n "$relink_command"; then
	    $opt_dry_run || {
	      if $finalize; then
	        tmpdir=`func_mktempdir`
		func_basename "$file$stripped_ext"
		file=$func_basename_result
	        outputname=$tmpdir/$file
	        # Replace the output file specification.
	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`

	        $opt_quiet || {
	          func_quote_for_expand "$relink_command"
		  eval "func_echo $func_quote_for_expand_result"
	        }
	        if eval "$relink_command"; then :
	          else
		  func_error "error: relink '$file' with the above command before installing it"
		  $opt_dry_run || ${RM}r "$tmpdir"
		  continue
	        fi
	        file=$outputname
	      else
	        func_warning "cannot relink '$file'"
	      fi
	    }
	  else
	    # Install the binary that we compiled earlier.
	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
	  fi
	fi

	# remove .exe since cygwin /usr/bin/install will append another
	# one anyway
	case $install_prog,$host in
	*/usr/bin/install*,*cygwin*)
	  case $file:$destfile in
	  *.exe:*.exe)
	    # this is ok
	    ;;
	  *.exe:*)
	    destfile=$destfile.exe
	    ;;
	  *:*.exe)
	    func_stripname '' '.exe' "$destfile"
	    destfile=$func_stripname_result
	    ;;
	  esac
	  ;;
	esac
	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
	$opt_dry_run || if test -n "$outputname"; then
	  ${RM}r "$tmpdir"
	fi
	;;
      esac
    done

    for file in $staticlibs; do
      func_basename "$file"
      name=$func_basename_result

      # Set up the ranlib parameters.
      oldlib=$destdir/$name
      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
      tool_oldlib=$func_to_tool_file_result

      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'

      if test -n "$stripme" && test -n "$old_striplib"; then
	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
      fi

      # Do each command in the postinstall commands.
      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
    done

    test -n "$future_libdirs" && \
      func_warning "remember to run '$progname --finish$future_libdirs'"

    if test -n "$current_libdirs"; then
      # Maybe just do a dry run.
      $opt_dry_run && current_libdirs=" -n$current_libdirs"
      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
    else
      exit $EXIT_SUCCESS
    fi
}

test install = "$opt_mode" && func_mode_install ${1+"$@"}


# func_generate_dlsyms outputname originator pic_p
# Extract symbols from dlprefiles and create ${outputname}S.o with
# a dlpreopen symbol table.
func_generate_dlsyms ()
{
    $debug_cmd

    my_outputname=$1
    my_originator=$2
    my_pic_p=${3-false}
    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
    my_dlsyms=

    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
      if test -n "$NM" && test -n "$global_symbol_pipe"; then
	my_dlsyms=${my_outputname}S.c
      else
	func_error "not configured to extract global symbols from dlpreopened files"
      fi
    fi

    if test -n "$my_dlsyms"; then
      case $my_dlsyms in
      "") ;;
      *.c)
	# Discover the nlist of each of the dlfiles.
	nlist=$output_objdir/$my_outputname.nm

	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"

	# Parse the name list into a source file.
	func_verbose "creating $output_objdir/$my_dlsyms"

	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */

#ifdef __cplusplus
extern \"C\" {
#endif

#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
#endif

/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
/* DATA imports from DLLs on WIN32 can't be const, because runtime
   relocations are performed -- see ld's documentation on pseudo-relocs.  */
# define LT_DLSYM_CONST
#elif defined __osf__
/* This system does not cope well with relocations in const data.  */
# define LT_DLSYM_CONST
#else
# define LT_DLSYM_CONST const
#endif

#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)

/* External symbol declarations for the compiler. */\
"

	if test yes = "$dlself"; then
	  func_verbose "generating symbol list for '$output'"

	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"

	  # Add our own program objects to the symbol list.
	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
	  for progfile in $progfiles; do
	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
	  done

	  if test -n "$exclude_expsyms"; then
	    $opt_dry_run || {
	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
	      eval '$MV "$nlist"T "$nlist"'
	    }
	  fi

	  if test -n "$export_symbols_regex"; then
	    $opt_dry_run || {
	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
	      eval '$MV "$nlist"T "$nlist"'
	    }
	  fi

	  # Prepare the list of exported symbols
	  if test -z "$export_symbols"; then
	    export_symbols=$output_objdir/$outputname.exp
	    $opt_dry_run || {
	      $RM $export_symbols
	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
	      case $host in
	      *cygwin* | *mingw* | *cegcc* )
                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
	        ;;
	      esac
	    }
	  else
	    $opt_dry_run || {
	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
	      eval '$MV "$nlist"T "$nlist"'
	      case $host in
	        *cygwin* | *mingw* | *cegcc* )
	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
	          ;;
	      esac
	    }
	  fi
	fi

	for dlprefile in $dlprefiles; do
	  func_verbose "extracting global C symbols from '$dlprefile'"
	  func_basename "$dlprefile"
	  name=$func_basename_result
          case $host in
	    *cygwin* | *mingw* | *cegcc* )
	      # if an import library, we need to obtain dlname
	      if func_win32_import_lib_p "$dlprefile"; then
	        func_tr_sh "$dlprefile"
	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
	        dlprefile_dlbasename=
	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
	          # Use subshell, to avoid clobbering current variable values
	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
	          if test -n "$dlprefile_dlname"; then
	            func_basename "$dlprefile_dlname"
	            dlprefile_dlbasename=$func_basename_result
	          else
	            # no lafile. user explicitly requested -dlpreopen <import library>.
	            $sharedlib_from_linklib_cmd "$dlprefile"
	            dlprefile_dlbasename=$sharedlib_from_linklib_result
	          fi
	        fi
	        $opt_dry_run || {
	          if test -n "$dlprefile_dlbasename"; then
	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
	          else
	            func_warning "Could not compute DLL name from $name"
	            eval '$ECHO ": $name " >> "$nlist"'
	          fi
	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
	        }
	      else # not an import lib
	        $opt_dry_run || {
	          eval '$ECHO ": $name " >> "$nlist"'
	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
	        }
	      fi
	    ;;
	    *)
	      $opt_dry_run || {
	        eval '$ECHO ": $name " >> "$nlist"'
	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
	      }
	    ;;
          esac
	done

	$opt_dry_run || {
	  # Make sure we have at least an empty file.
	  test -f "$nlist" || : > "$nlist"

	  if test -n "$exclude_expsyms"; then
	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
	    $MV "$nlist"T "$nlist"
	  fi

	  # Try sorting and uniquifying the output.
	  if $GREP -v "^: " < "$nlist" |
	      if sort -k 3 </dev/null >/dev/null 2>&1; then
		sort -k 3
	      else
		sort +2
	      fi |
	      uniq > "$nlist"S; then
	    :
	  else
	    $GREP -v "^: " < "$nlist" > "$nlist"S
	  fi

	  if test -f "$nlist"S; then
	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
	  else
	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
	  fi

	  func_show_eval '$RM "${nlist}I"'
	  if test -n "$global_symbol_to_import"; then
	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
	  fi

	  echo >> "$output_objdir/$my_dlsyms" "\

/* The mapping between symbol names and symbols.  */
typedef struct {
  const char *name;
  void *address;
} lt_dlsymlist;
extern LT_DLSYM_CONST lt_dlsymlist
lt_${my_prefix}_LTX_preloaded_symbols[];\
"

	  if test -s "$nlist"I; then
	    echo >> "$output_objdir/$my_dlsyms" "\
static void lt_syminit(void)
{
  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
  for (; symbol->name; ++symbol)
    {"
	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
	    echo >> "$output_objdir/$my_dlsyms" "\
    }
}"
	  fi
	  echo >> "$output_objdir/$my_dlsyms" "\
LT_DLSYM_CONST lt_dlsymlist
lt_${my_prefix}_LTX_preloaded_symbols[] =
{ {\"$my_originator\", (void *) 0},"

	  if test -s "$nlist"I; then
	    echo >> "$output_objdir/$my_dlsyms" "\
  {\"@INIT@\", (void *) &lt_syminit},"
	  fi

	  case $need_lib_prefix in
	  no)
	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
	    ;;
	  *)
	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
	    ;;
	  esac
	  echo >> "$output_objdir/$my_dlsyms" "\
  {0, (void *) 0}
};

/* This works around a problem in FreeBSD linker */
#ifdef FREEBSD_WORKAROUND
static const void *lt_preloaded_setup() {
  return lt_${my_prefix}_LTX_preloaded_symbols;
}
#endif

#ifdef __cplusplus
}
#endif\
"
	} # !$opt_dry_run

	pic_flag_for_symtable=
	case "$compile_command " in
	*" -static "*) ;;
	*)
	  case $host in
	  # compiling the symbol table file with pic_flag works around
	  # a FreeBSD bug that causes programs to crash when -lm is
	  # linked before any other PIC object.  But we must not use
	  # pic_flag when linking with -static.  The problem exists in
	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
	  *-*-hpux*)
	    pic_flag_for_symtable=" $pic_flag"  ;;
	  *)
	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
	    ;;
	  esac
	  ;;
	esac
	symtab_cflags=
	for arg in $LTCFLAGS; do
	  case $arg in
	  -pie | -fpie | -fPIE) ;;
	  *) func_append symtab_cflags " $arg" ;;
	  esac
	done

	# Now compile the dynamic symbol file.
	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'

	# Clean up the generated files.
	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'

	# Transform the symbol file into the correct name.
	symfileobj=$output_objdir/${my_outputname}S.$objext
	case $host in
	*cygwin* | *mingw* | *cegcc* )
	  if test -f "$output_objdir/$my_outputname.def"; then
	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
	  else
	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
	  fi
	  ;;
	*)
	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
	  ;;
	esac
	;;
      *)
	func_fatal_error "unknown suffix for '$my_dlsyms'"
	;;
      esac
    else
      # We keep going just in case the user didn't refer to
      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
      # really was required.

      # Nullify the symbol file.
      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
    fi
}

# func_cygming_gnu_implib_p ARG
# This predicate returns with zero status (TRUE) if
# ARG is a GNU/binutils-style import library. Returns
# with nonzero status (FALSE) otherwise.
func_cygming_gnu_implib_p ()
{
  $debug_cmd

  func_to_tool_file "$1" func_convert_file_msys_to_w32
  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
  test -n "$func_cygming_gnu_implib_tmp"
}

# func_cygming_ms_implib_p ARG
# This predicate returns with zero status (TRUE) if
# ARG is an MS-style import library. Returns
# with nonzero status (FALSE) otherwise.
func_cygming_ms_implib_p ()
{
  $debug_cmd

  func_to_tool_file "$1" func_convert_file_msys_to_w32
  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
  test -n "$func_cygming_ms_implib_tmp"
}

# func_win32_libid arg
# return the library type of file 'arg'
#
# Need a lot of goo to handle *both* DLLs and import libs
# Has to be a shell function in order to 'eat' the argument
# that is supplied when $file_magic_command is called.
# Despite the name, also deal with 64 bit binaries.
func_win32_libid ()
{
  $debug_cmd

  win32_libid_type=unknown
  win32_fileres=`file -L $1 2>/dev/null`
  case $win32_fileres in
  *ar\ archive\ import\ library*) # definitely import
    win32_libid_type="x86 archive import"
    ;;
  *ar\ archive*) # could be an import, or static
    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
      case $nm_interface in
      "MS dumpbin")
	if func_cygming_ms_implib_p "$1" ||
	   func_cygming_gnu_implib_p "$1"
	then
	  win32_nmres=import
	else
	  win32_nmres=
	fi
	;;
      *)
	func_to_tool_file "$1" func_convert_file_msys_to_w32
	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
	  $SED -n -e '
	    1,100{
		/ I /{
		    s|.*|import|
		    p
		    q
		}
	    }'`
	;;
      esac
      case $win32_nmres in
      import*)  win32_libid_type="x86 archive import";;
      *)        win32_libid_type="x86 archive static";;
      esac
    fi
    ;;
  *DLL*)
    win32_libid_type="x86 DLL"
    ;;
  *executable*) # but shell scripts are "executable" too...
    case $win32_fileres in
    *MS\ Windows\ PE\ Intel*)
      win32_libid_type="x86 DLL"
      ;;
    esac
    ;;
  esac
  $ECHO "$win32_libid_type"
}

# func_cygming_dll_for_implib ARG
#
# Platform-specific function to extract the
# name of the DLL associated with the specified
# import library ARG.
# Invoked by eval'ing the libtool variable
#    $sharedlib_from_linklib_cmd
# Result is available in the variable
#    $sharedlib_from_linklib_result
func_cygming_dll_for_implib ()
{
  $debug_cmd

  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
}

# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
#
# The is the core of a fallback implementation of a
# platform-specific function to extract the name of the
# DLL associated with the specified import library LIBNAME.
#
# SECTION_NAME is either .idata$6 or .idata$7, depending
# on the platform and compiler that created the implib.
#
# Echos the name of the DLL associated with the
# specified import library.
func_cygming_dll_for_implib_fallback_core ()
{
  $debug_cmd

  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
    $SED '/^Contents of section '"$match_literal"':/{
      # Place marker at beginning of archive member dllname section
      s/.*/====MARK====/
      p
      d
    }
    # These lines can sometimes be longer than 43 characters, but
    # are always uninteresting
    /:[	 ]*file format pe[i]\{,1\}-/d
    /^In archive [^:]*:/d
    # Ensure marker is printed
    /^====MARK====/p
    # Remove all lines with less than 43 characters
    /^.\{43\}/!d
    # From remaining lines, remove first 43 characters
    s/^.\{43\}//' |
    $SED -n '
      # Join marker and all lines until next marker into a single line
      /^====MARK====/ b para
      H
      $ b para
      b
      :para
      x
      s/\n//g
      # Remove the marker
      s/^====MARK====//
      # Remove trailing dots and whitespace
      s/[\. \t]*$//
      # Print
      /./p' |
    # we now have a list, one entry per line, of the stringified
    # contents of the appropriate section of all members of the
    # archive that possess that section. Heuristic: eliminate
    # all those that have a first or second character that is
    # a '.' (that is, objdump's representation of an unprintable
    # character.) This should work for all archives with less than
    # 0x302f exports -- but will fail for DLLs whose name actually
    # begins with a literal '.' or a single character followed by
    # a '.'.
    #
    # Of those that remain, print the first one.
    $SED -e '/^\./d;/^.\./d;q'
}

# func_cygming_dll_for_implib_fallback ARG
# Platform-specific function to extract the
# name of the DLL associated with the specified
# import library ARG.
#
# This fallback implementation is for use when $DLLTOOL
# does not support the --identify-strict option.
# Invoked by eval'ing the libtool variable
#    $sharedlib_from_linklib_cmd
# Result is available in the variable
#    $sharedlib_from_linklib_result
func_cygming_dll_for_implib_fallback ()
{
  $debug_cmd

  if func_cygming_gnu_implib_p "$1"; then
    # binutils import library
    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
  elif func_cygming_ms_implib_p "$1"; then
    # ms-generated import library
    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
  else
    # unknown
    sharedlib_from_linklib_result=
  fi
}


# func_extract_an_archive dir oldlib
func_extract_an_archive ()
{
    $debug_cmd

    f_ex_an_ar_dir=$1; shift
    f_ex_an_ar_oldlib=$1
    if test yes = "$lock_old_archive_extraction"; then
      lockfile=$f_ex_an_ar_oldlib.lock
      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
	func_echo "Waiting for $lockfile to be removed"
	sleep 2
      done
    fi
    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
		   'stat=$?; rm -f "$lockfile"; exit $stat'
    if test yes = "$lock_old_archive_extraction"; then
      $opt_dry_run || rm -f "$lockfile"
    fi
    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
     :
    else
      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
    fi
}


# func_extract_archives gentop oldlib ...
func_extract_archives ()
{
    $debug_cmd

    my_gentop=$1; shift
    my_oldlibs=${1+"$@"}
    my_oldobjs=
    my_xlib=
    my_xabs=
    my_xdir=

    for my_xlib in $my_oldlibs; do
      # Extract the objects.
      case $my_xlib in
	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
	*) my_xabs=`pwd`"/$my_xlib" ;;
      esac
      func_basename "$my_xlib"
      my_xlib=$func_basename_result
      my_xlib_u=$my_xlib
      while :; do
        case " $extracted_archives " in
	*" $my_xlib_u "*)
	  func_arith $extracted_serial + 1
	  extracted_serial=$func_arith_result
	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
	*) break ;;
	esac
      done
      extracted_archives="$extracted_archives $my_xlib_u"
      my_xdir=$my_gentop/$my_xlib_u

      func_mkdir_p "$my_xdir"

      case $host in
      *-darwin*)
	func_verbose "Extracting $my_xabs"
	# Do not bother doing anything if just a dry run
	$opt_dry_run || {
	  darwin_orig_dir=`pwd`
	  cd $my_xdir || exit $?
	  darwin_archive=$my_xabs
	  darwin_curdir=`pwd`
	  func_basename "$darwin_archive"
	  darwin_base_archive=$func_basename_result
	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
	  if test -n "$darwin_arches"; then
	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
	    darwin_arch=
	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
	    for darwin_arch in  $darwin_arches; do
	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
	      cd "$darwin_curdir"
	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
	    done # $darwin_arches
            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
	    darwin_file=
	    darwin_files=
	    for darwin_file in $darwin_filelist; do
	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
	      $LIPO -create -output "$darwin_file" $darwin_files
	    done # $darwin_filelist
	    $RM -rf unfat-$$
	    cd "$darwin_orig_dir"
	  else
	    cd $darwin_orig_dir
	    func_extract_an_archive "$my_xdir" "$my_xabs"
	  fi # $darwin_arches
	} # !$opt_dry_run
	;;
      *)
        func_extract_an_archive "$my_xdir" "$my_xabs"
	;;
      esac
      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
    done

    func_extract_archives_result=$my_oldobjs
}


# func_emit_wrapper [arg=no]
#
# Emit a libtool wrapper script on stdout.
# Don't directly open a file because we may want to
# incorporate the script contents within a cygwin/mingw
# wrapper executable.  Must ONLY be called from within
# func_mode_link because it depends on a number of variables
# set therein.
#
# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
# variable will take.  If 'yes', then the emitted script
# will assume that the directory where it is stored is
# the $objdir directory.  This is a cygwin/mingw-specific
# behavior.
func_emit_wrapper ()
{
	func_emit_wrapper_arg1=${1-no}

	$ECHO "\
#! $SHELL

# $output - temporary wrapper script for $objdir/$outputname
# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
#
# The $output program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='$sed_quote_subst'

# Be Bourne compatible
if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '\${1+\"\$@\"}'='\"\$@\"'
  setopt NO_GLOB_SUBST
else
  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command=\"$relink_command\"

# This environment variable determines our operation mode.
if test \"\$libtool_install_magic\" = \"$magic\"; then
  # install mode needs the following variables:
  generated_by_libtool_version='$macro_version'
  notinst_deplibs='$notinst_deplibs'
else
  # When we are sourced in execute mode, \$file and \$ECHO are already set.
  if test \"\$libtool_execute_magic\" != \"$magic\"; then
    file=\"\$0\""

    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
    $ECHO "\

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
\$1
_LTECHO_EOF'
}
    ECHO=\"$qECHO\"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string "--lt-"
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's $0 value, followed by "$@".
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=\$0
  shift
  for lt_opt
  do
    case \"\$lt_opt\" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
        cat \"\$lt_dump_D/\$lt_dump_F\"
        exit 0
      ;;
    --lt-*)
        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n \"\$lt_option_debug\"; then
    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{
"
  case $host in
  # Backslashes separate directories on plain windows
  *-*-mingw | *-*-os2* | *-cegcc*)
    $ECHO "\
      if test -n \"\$lt_option_debug\"; then
        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
        func_lt_dump_args \${1+\"\$@\"} 1>&2
      fi
      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
"
    ;;

  *)
    $ECHO "\
      if test -n \"\$lt_option_debug\"; then
        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
        func_lt_dump_args \${1+\"\$@\"} 1>&2
      fi
      exec \"\$progdir/\$program\" \${1+\"\$@\"}
"
    ;;
  esac
  $ECHO "\
      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from \$@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case \" \$* \" in
  *\\ --lt-*)
    for lt_wr_arg
    do
      case \$lt_wr_arg in
      --lt-*) ;;
      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core \${1+\"\$@\"}
}

  # Parse options
  func_parse_lt_options \"\$0\" \${1+\"\$@\"}

  # Find the directory that this script lives in.
  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
  test \"x\$thisdir\" = \"x\$file\" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
  while test -n \"\$file\"; do
    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`

    # If there was a directory component, then change thisdir.
    if test \"x\$destdir\" != \"x\$file\"; then
      case \"\$destdir\" in
      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
      *) thisdir=\"\$thisdir/\$destdir\" ;;
      esac
    fi

    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
    # special case for '.'
    if test \"\$thisdir\" = \".\"; then
      thisdir=\`pwd\`
    fi
    # remove .libs from thisdir
    case \"\$thisdir\" in
    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
    $objdir )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=\`cd \"\$thisdir\" && pwd\`
  test -n \"\$absdir\" && thisdir=\"\$absdir\"
"

	if test yes = "$fast_install"; then
	  $ECHO "\
  program=lt-'$outputname'$exeext
  progdir=\"\$thisdir/$objdir\"

  if test ! -f \"\$progdir/\$program\" ||
     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
       test \"X\$file\" != \"X\$progdir/\$program\"; }; then

    file=\"\$\$-\$program\"

    if test ! -d \"\$progdir\"; then
      $MKDIR \"\$progdir\"
    else
      $RM \"\$progdir/\$file\"
    fi"

	  $ECHO "\

    # relink executable if necessary
    if test -n \"\$relink_command\"; then
      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
      else
	\$ECHO \"\$relink_command_output\" >&2
	$RM \"\$progdir/\$file\"
	exit 1
      fi
    fi

    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
    { $RM \"\$progdir/\$program\";
      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
    $RM \"\$progdir/\$file\"
  fi"
	else
	  $ECHO "\
  program='$outputname'
  progdir=\"\$thisdir/$objdir\"
"
	fi

	$ECHO "\

  if test -f \"\$progdir/\$program\"; then"

	# fixup the dll searchpath if we need to.
	#
	# Fix the DLL searchpath if we need to.  Do this before prepending
	# to shlibpath, because on Windows, both are PATH and uninstalled
	# libraries must come first.
	if test -n "$dllsearchpath"; then
	  $ECHO "\
    # Add the dll search path components to the executable PATH
    PATH=$dllsearchpath:\$PATH
"
	fi

	# Export our shlibpath_var if we have one.
	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
	  $ECHO "\
    # Add our own library path to $shlibpath_var
    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"

    # Some systems cannot cope with colon-terminated $shlibpath_var
    # The second colon is a workaround for a bug in BeOS R4 sed
    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`

    export $shlibpath_var
"
	fi

	$ECHO "\
    if test \"\$libtool_execute_magic\" != \"$magic\"; then
      # Run the actual program with our arguments.
      func_exec_program \${1+\"\$@\"}
    fi
  else
    # The program doesn't exist.
    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
    exit 1
  fi
fi\
"
}


# func_emit_cwrapperexe_src
# emit the source code for a wrapper executable on stdout
# Must ONLY be called from within func_mode_link because
# it depends on a number of variable set therein.
func_emit_cwrapperexe_src ()
{
	cat <<EOF

/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
   Generated by $PROGRAM (GNU $PACKAGE) $VERSION

   The $output program cannot be directly executed until all the libtool
   libraries that it depends on are installed.

   This wrapper executable should never be moved out of the build directory.
   If it is, it will not operate correctly.
*/
EOF
	    cat <<"EOF"
#ifdef _MSC_VER
# define _CRT_SECURE_NO_DEPRECATE 1
#endif
#include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
# include <direct.h>
# include <process.h>
# include <io.h>
#else
# include <unistd.h>
# include <stdint.h>
# ifdef __CYGWIN__
#  include <io.h>
# endif
#endif
#include <malloc.h>
#include <stdarg.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>

#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)

/* declarations of non-ANSI functions */
#if defined __MINGW32__
# ifdef __STRICT_ANSI__
int _putenv (const char *);
# endif
#elif defined __CYGWIN__
# ifdef __STRICT_ANSI__
char *realpath (const char *, char *);
int putenv (char *);
int setenv (const char *, const char *, int);
# endif
/* #elif defined other_platform || defined ... */
#endif

/* portability defines, excluding path handling macros */
#if defined _MSC_VER
# define setmode _setmode
# define stat    _stat
# define chmod   _chmod
# define getcwd  _getcwd
# define putenv  _putenv
# define S_IXUSR _S_IEXEC
#elif defined __MINGW32__
# define setmode _setmode
# define stat    _stat
# define chmod   _chmod
# define getcwd  _getcwd
# define putenv  _putenv
#elif defined __CYGWIN__
# define HAVE_SETENV
# define FOPEN_WB "wb"
/* #elif defined other platforms ... */
#endif

#if defined PATH_MAX
# define LT_PATHMAX PATH_MAX
#elif defined MAXPATHLEN
# define LT_PATHMAX MAXPATHLEN
#else
# define LT_PATHMAX 1024
#endif

#ifndef S_IXOTH
# define S_IXOTH 0
#endif
#ifndef S_IXGRP
# define S_IXGRP 0
#endif

/* path handling portability macros */
#ifndef DIR_SEPARATOR
# define DIR_SEPARATOR '/'
# define PATH_SEPARATOR ':'
#endif

#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
  defined __OS2__
# define HAVE_DOS_BASED_FILE_SYSTEM
# define FOPEN_WB "wb"
# ifndef DIR_SEPARATOR_2
#  define DIR_SEPARATOR_2 '\\'
# endif
# ifndef PATH_SEPARATOR_2
#  define PATH_SEPARATOR_2 ';'
# endif
#endif

#ifndef DIR_SEPARATOR_2
# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
#else /* DIR_SEPARATOR_2 */
# define IS_DIR_SEPARATOR(ch) \
	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
#endif /* DIR_SEPARATOR_2 */

#ifndef PATH_SEPARATOR_2
# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
#else /* PATH_SEPARATOR_2 */
# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
#endif /* PATH_SEPARATOR_2 */

#ifndef FOPEN_WB
# define FOPEN_WB "w"
#endif
#ifndef _O_BINARY
# define _O_BINARY 0
#endif

#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
#define XFREE(stale) do { \
  if (stale) { free (stale); stale = 0; } \
} while (0)

#if defined LT_DEBUGWRAPPER
static int lt_debug = 1;
#else
static int lt_debug = 0;
#endif

const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */

void *xmalloc (size_t num);
char *xstrdup (const char *string);
const char *base_name (const char *name);
char *find_executable (const char *wrapper);
char *chase_symlinks (const char *pathspec);
int make_executable (const char *path);
int check_executable (const char *path);
char *strendzap (char *str, const char *pat);
void lt_debugprintf (const char *file, int line, const char *fmt, ...);
void lt_fatal (const char *file, int line, const char *message, ...);
static const char *nonnull (const char *s);
static const char *nonempty (const char *s);
void lt_setenv (const char *name, const char *value);
char *lt_extend_str (const char *orig_value, const char *add, int to_end);
void lt_update_exe_path (const char *name, const char *value);
void lt_update_lib_path (const char *name, const char *value);
char **prepare_spawn (char **argv);
void lt_dump_script (FILE *f);
EOF

	    cat <<EOF
#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
# define externally_visible volatile
#else
# define externally_visible __attribute__((externally_visible)) volatile
#endif
externally_visible const char * MAGIC_EXE = "$magic_exe";
const char * LIB_PATH_VARNAME = "$shlibpath_var";
EOF

	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
              func_to_host_path "$temp_rpath"
	      cat <<EOF
const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
EOF
	    else
	      cat <<"EOF"
const char * LIB_PATH_VALUE   = "";
EOF
	    fi

	    if test -n "$dllsearchpath"; then
              func_to_host_path "$dllsearchpath:"
	      cat <<EOF
const char * EXE_PATH_VARNAME = "PATH";
const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
EOF
	    else
	      cat <<"EOF"
const char * EXE_PATH_VARNAME = "";
const char * EXE_PATH_VALUE   = "";
EOF
	    fi

	    if test yes = "$fast_install"; then
	      cat <<EOF
const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
EOF
	    else
	      cat <<EOF
const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
EOF
	    fi


	    cat <<"EOF"

#define LTWRAPPER_OPTION_PREFIX         "--lt-"

static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";

int
main (int argc, char *argv[])
{
  char **newargz;
  int  newargc;
  char *tmp_pathspec;
  char *actual_cwrapper_path;
  char *actual_cwrapper_name;
  char *target_name;
  char *lt_argv_zero;
  int rval = 127;

  int i;

  program_name = (char *) xstrdup (base_name (argv[0]));
  newargz = XMALLOC (char *, (size_t) argc + 1);

  /* very simple arg parsing; don't want to rely on getopt
   * also, copy all non cwrapper options to newargz, except
   * argz[0], which is handled differently
   */
  newargc=0;
  for (i = 1; i < argc; i++)
    {
      if (STREQ (argv[i], dumpscript_opt))
	{
EOF
	    case $host in
	      *mingw* | *cygwin* )
		# make stdout use "unix" line endings
		echo "          setmode(1,_O_BINARY);"
		;;
	      esac

	    cat <<"EOF"
	  lt_dump_script (stdout);
	  return 0;
	}
      if (STREQ (argv[i], debug_opt))
	{
          lt_debug = 1;
          continue;
	}
      if (STREQ (argv[i], ltwrapper_option_prefix))
        {
          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
             namespace, but it is not one of the ones we know about and
             have already dealt with, above (inluding dump-script), then
             report an error. Otherwise, targets might begin to believe
             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
             namespace. The first time any user complains about this, we'll
             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
             or a configure.ac-settable value.
           */
          lt_fatal (__FILE__, __LINE__,
		    "unrecognized %s option: '%s'",
                    ltwrapper_option_prefix, argv[i]);
        }
      /* otherwise ... */
      newargz[++newargc] = xstrdup (argv[i]);
    }
  newargz[++newargc] = NULL;

EOF
	    cat <<EOF
  /* The GNU banner must be the first non-error debug message */
  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
EOF
	    cat <<"EOF"
  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);

  tmp_pathspec = find_executable (argv[0]);
  if (tmp_pathspec == NULL)
    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
  lt_debugprintf (__FILE__, __LINE__,
                  "(main) found exe (before symlink chase) at: %s\n",
		  tmp_pathspec);

  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
  lt_debugprintf (__FILE__, __LINE__,
                  "(main) found exe (after symlink chase) at: %s\n",
		  actual_cwrapper_path);
  XFREE (tmp_pathspec);

  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
  strendzap (actual_cwrapper_path, actual_cwrapper_name);

  /* wrapper name transforms */
  strendzap (actual_cwrapper_name, ".exe");
  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
  XFREE (actual_cwrapper_name);
  actual_cwrapper_name = tmp_pathspec;
  tmp_pathspec = 0;

  /* target_name transforms -- use actual target program name; might have lt- prefix */
  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
  strendzap (target_name, ".exe");
  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
  XFREE (target_name);
  target_name = tmp_pathspec;
  tmp_pathspec = 0;

  lt_debugprintf (__FILE__, __LINE__,
		  "(main) libtool target name: %s\n",
		  target_name);
EOF

	    cat <<EOF
  newargz[0] =
    XMALLOC (char, (strlen (actual_cwrapper_path) +
		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
  strcpy (newargz[0], actual_cwrapper_path);
  strcat (newargz[0], "$objdir");
  strcat (newargz[0], "/");
EOF

	    cat <<"EOF"
  /* stop here, and copy so we don't have to do this twice */
  tmp_pathspec = xstrdup (newargz[0]);

  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
  strcat (newargz[0], actual_cwrapper_name);

  /* DO want the lt- prefix here if it exists, so use target_name */
  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
  XFREE (tmp_pathspec);
  tmp_pathspec = NULL;
EOF

	    case $host_os in
	      mingw*)
	    cat <<"EOF"
  {
    char* p;
    while ((p = strchr (newargz[0], '\\')) != NULL)
      {
	*p = '/';
      }
    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
      {
	*p = '/';
      }
  }
EOF
	    ;;
	    esac

	    cat <<"EOF"
  XFREE (target_name);
  XFREE (actual_cwrapper_path);
  XFREE (actual_cwrapper_name);

  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
     because on Windows, both *_VARNAMEs are PATH but uninstalled
     libraries must come first. */
  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);

  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
		  nonnull (lt_argv_zero));
  for (i = 0; i < newargc; i++)
    {
      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
		      i, nonnull (newargz[i]));
    }

EOF

	    case $host_os in
	      mingw*)
		cat <<"EOF"
  /* execv doesn't actually work on mingw as expected on unix */
  newargz = prepare_spawn (newargz);
  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
  if (rval == -1)
    {
      /* failed to start process */
      lt_debugprintf (__FILE__, __LINE__,
		      "(main) failed to launch target \"%s\": %s\n",
		      lt_argv_zero, nonnull (strerror (errno)));
      return 127;
    }
  return rval;
EOF
		;;
	      *)
		cat <<"EOF"
  execv (lt_argv_zero, newargz);
  return rval; /* =127, but avoids unused variable warning */
EOF
		;;
	    esac

	    cat <<"EOF"
}

void *
xmalloc (size_t num)
{
  void *p = (void *) malloc (num);
  if (!p)
    lt_fatal (__FILE__, __LINE__, "memory exhausted");

  return p;
}

char *
xstrdup (const char *string)
{
  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
			  string) : NULL;
}

const char *
base_name (const char *name)
{
  const char *base;

#if defined HAVE_DOS_BASED_FILE_SYSTEM
  /* Skip over the disk name in MSDOS pathnames. */
  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
    name += 2;
#endif

  for (base = name; *name; name++)
    if (IS_DIR_SEPARATOR (*name))
      base = name + 1;
  return base;
}

int
check_executable (const char *path)
{
  struct stat st;

  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
                  nonempty (path));
  if ((!path) || (!*path))
    return 0;

  if ((stat (path, &st) >= 0)
      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
    return 1;
  else
    return 0;
}

int
make_executable (const char *path)
{
  int rval = 0;
  struct stat st;

  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
                  nonempty (path));
  if ((!path) || (!*path))
    return 0;

  if (stat (path, &st) >= 0)
    {
      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
    }
  return rval;
}

/* Searches for the full path of the wrapper.  Returns
   newly allocated full path name if found, NULL otherwise
   Does not chase symlinks, even on platforms that support them.
*/
char *
find_executable (const char *wrapper)
{
  int has_slash = 0;
  const char *p;
  const char *p_next;
  /* static buffer for getcwd */
  char tmp[LT_PATHMAX + 1];
  size_t tmp_len;
  char *concat_name;

  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
                  nonempty (wrapper));

  if ((wrapper == NULL) || (*wrapper == '\0'))
    return NULL;

  /* Absolute path? */
#if defined HAVE_DOS_BASED_FILE_SYSTEM
  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
    {
      concat_name = xstrdup (wrapper);
      if (check_executable (concat_name))
	return concat_name;
      XFREE (concat_name);
    }
  else
    {
#endif
      if (IS_DIR_SEPARATOR (wrapper[0]))
	{
	  concat_name = xstrdup (wrapper);
	  if (check_executable (concat_name))
	    return concat_name;
	  XFREE (concat_name);
	}
#if defined HAVE_DOS_BASED_FILE_SYSTEM
    }
#endif

  for (p = wrapper; *p; p++)
    if (*p == '/')
      {
	has_slash = 1;
	break;
      }
  if (!has_slash)
    {
      /* no slashes; search PATH */
      const char *path = getenv ("PATH");
      if (path != NULL)
	{
	  for (p = path; *p; p = p_next)
	    {
	      const char *q;
	      size_t p_len;
	      for (q = p; *q; q++)
		if (IS_PATH_SEPARATOR (*q))
		  break;
	      p_len = (size_t) (q - p);
	      p_next = (*q == '\0' ? q : q + 1);
	      if (p_len == 0)
		{
		  /* empty path: current directory */
		  if (getcwd (tmp, LT_PATHMAX) == NULL)
		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
                              nonnull (strerror (errno)));
		  tmp_len = strlen (tmp);
		  concat_name =
		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
		  memcpy (concat_name, tmp, tmp_len);
		  concat_name[tmp_len] = '/';
		  strcpy (concat_name + tmp_len + 1, wrapper);
		}
	      else
		{
		  concat_name =
		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
		  memcpy (concat_name, p, p_len);
		  concat_name[p_len] = '/';
		  strcpy (concat_name + p_len + 1, wrapper);
		}
	      if (check_executable (concat_name))
		return concat_name;
	      XFREE (concat_name);
	    }
	}
      /* not found in PATH; assume curdir */
    }
  /* Relative path | not found in path: prepend cwd */
  if (getcwd (tmp, LT_PATHMAX) == NULL)
    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
              nonnull (strerror (errno)));
  tmp_len = strlen (tmp);
  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
  memcpy (concat_name, tmp, tmp_len);
  concat_name[tmp_len] = '/';
  strcpy (concat_name + tmp_len + 1, wrapper);

  if (check_executable (concat_name))
    return concat_name;
  XFREE (concat_name);
  return NULL;
}

char *
chase_symlinks (const char *pathspec)
{
#ifndef S_ISLNK
  return xstrdup (pathspec);
#else
  char buf[LT_PATHMAX];
  struct stat s;
  char *tmp_pathspec = xstrdup (pathspec);
  char *p;
  int has_symlinks = 0;
  while (strlen (tmp_pathspec) && !has_symlinks)
    {
      lt_debugprintf (__FILE__, __LINE__,
		      "checking path component for symlinks: %s\n",
		      tmp_pathspec);
      if (lstat (tmp_pathspec, &s) == 0)
	{
	  if (S_ISLNK (s.st_mode) != 0)
	    {
	      has_symlinks = 1;
	      break;
	    }

	  /* search backwards for last DIR_SEPARATOR */
	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
	    p--;
	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
	    {
	      /* no more DIR_SEPARATORS left */
	      break;
	    }
	  *p = '\0';
	}
      else
	{
	  lt_fatal (__FILE__, __LINE__,
		    "error accessing file \"%s\": %s",
		    tmp_pathspec, nonnull (strerror (errno)));
	}
    }
  XFREE (tmp_pathspec);

  if (!has_symlinks)
    {
      return xstrdup (pathspec);
    }

  tmp_pathspec = realpath (pathspec, buf);
  if (tmp_pathspec == 0)
    {
      lt_fatal (__FILE__, __LINE__,
		"could not follow symlinks for %s", pathspec);
    }
  return xstrdup (tmp_pathspec);
#endif
}

char *
strendzap (char *str, const char *pat)
{
  size_t len, patlen;

  assert (str != NULL);
  assert (pat != NULL);

  len = strlen (str);
  patlen = strlen (pat);

  if (patlen <= len)
    {
      str += len - patlen;
      if (STREQ (str, pat))
	*str = '\0';
    }
  return str;
}

void
lt_debugprintf (const char *file, int line, const char *fmt, ...)
{
  va_list args;
  if (lt_debug)
    {
      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
      va_start (args, fmt);
      (void) vfprintf (stderr, fmt, args);
      va_end (args);
    }
}

static void
lt_error_core (int exit_status, const char *file,
	       int line, const char *mode,
	       const char *message, va_list ap)
{
  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
  vfprintf (stderr, message, ap);
  fprintf (stderr, ".\n");

  if (exit_status >= 0)
    exit (exit_status);
}

void
lt_fatal (const char *file, int line, const char *message, ...)
{
  va_list ap;
  va_start (ap, message);
  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
  va_end (ap);
}

static const char *
nonnull (const char *s)
{
  return s ? s : "(null)";
}

static const char *
nonempty (const char *s)
{
  return (s && !*s) ? "(empty)" : nonnull (s);
}

void
lt_setenv (const char *name, const char *value)
{
  lt_debugprintf (__FILE__, __LINE__,
		  "(lt_setenv) setting '%s' to '%s'\n",
                  nonnull (name), nonnull (value));
  {
#ifdef HAVE_SETENV
    /* always make a copy, for consistency with !HAVE_SETENV */
    char *str = xstrdup (value);
    setenv (name, str, 1);
#else
    size_t len = strlen (name) + 1 + strlen (value) + 1;
    char *str = XMALLOC (char, len);
    sprintf (str, "%s=%s", name, value);
    if (putenv (str) != EXIT_SUCCESS)
      {
        XFREE (str);
      }
#endif
  }
}

char *
lt_extend_str (const char *orig_value, const char *add, int to_end)
{
  char *new_value;
  if (orig_value && *orig_value)
    {
      size_t orig_value_len = strlen (orig_value);
      size_t add_len = strlen (add);
      new_value = XMALLOC (char, add_len + orig_value_len + 1);
      if (to_end)
        {
          strcpy (new_value, orig_value);
          strcpy (new_value + orig_value_len, add);
        }
      else
        {
          strcpy (new_value, add);
          strcpy (new_value + add_len, orig_value);
        }
    }
  else
    {
      new_value = xstrdup (add);
    }
  return new_value;
}

void
lt_update_exe_path (const char *name, const char *value)
{
  lt_debugprintf (__FILE__, __LINE__,
		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
                  nonnull (name), nonnull (value));

  if (name && *name && value && *value)
    {
      char *new_value = lt_extend_str (getenv (name), value, 0);
      /* some systems can't cope with a ':'-terminated path #' */
      size_t len = strlen (new_value);
      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
        {
          new_value[--len] = '\0';
        }
      lt_setenv (name, new_value);
      XFREE (new_value);
    }
}

void
lt_update_lib_path (const char *name, const char *value)
{
  lt_debugprintf (__FILE__, __LINE__,
		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
                  nonnull (name), nonnull (value));

  if (name && *name && value && *value)
    {
      char *new_value = lt_extend_str (getenv (name), value, 0);
      lt_setenv (name, new_value);
      XFREE (new_value);
    }
}

EOF
	    case $host_os in
	      mingw*)
		cat <<"EOF"

/* Prepares an argument vector before calling spawn().
   Note that spawn() does not by itself call the command interpreter
     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
         GetVersionEx(&v);
         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
      }) ? "cmd.exe" : "command.com").
   Instead it simply concatenates the arguments, separated by ' ', and calls
   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
   special way:
   - Space and tab are interpreted as delimiters. They are not treated as
     delimiters if they are surrounded by double quotes: "...".
   - Unescaped double quotes are removed from the input. Their only effect is
     that within double quotes, space and tab are treated like normal
     characters.
   - Backslashes not followed by double quotes are not special.
   - But 2*n+1 backslashes followed by a double quote become
     n backslashes followed by a double quote (n >= 0):
       \" -> "
       \\\" -> \"
       \\\\\" -> \\"
 */
#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
char **
prepare_spawn (char **argv)
{
  size_t argc;
  char **new_argv;
  size_t i;

  /* Count number of arguments.  */
  for (argc = 0; argv[argc] != NULL; argc++)
    ;

  /* Allocate new argument vector.  */
  new_argv = XMALLOC (char *, argc + 1);

  /* Put quoted arguments into the new argument vector.  */
  for (i = 0; i < argc; i++)
    {
      const char *string = argv[i];

      if (string[0] == '\0')
	new_argv[i] = xstrdup ("\"\"");
      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
	{
	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
	  size_t length;
	  unsigned int backslashes;
	  const char *s;
	  char *quoted_string;
	  char *p;

	  length = 0;
	  backslashes = 0;
	  if (quote_around)
	    length++;
	  for (s = string; *s != '\0'; s++)
	    {
	      char c = *s;
	      if (c == '"')
		length += backslashes + 1;
	      length++;
	      if (c == '\\')
		backslashes++;
	      else
		backslashes = 0;
	    }
	  if (quote_around)
	    length += backslashes + 1;

	  quoted_string = XMALLOC (char, length + 1);

	  p = quoted_string;
	  backslashes = 0;
	  if (quote_around)
	    *p++ = '"';
	  for (s = string; *s != '\0'; s++)
	    {
	      char c = *s;
	      if (c == '"')
		{
		  unsigned int j;
		  for (j = backslashes + 1; j > 0; j--)
		    *p++ = '\\';
		}
	      *p++ = c;
	      if (c == '\\')
		backslashes++;
	      else
		backslashes = 0;
	    }
	  if (quote_around)
	    {
	      unsigned int j;
	      for (j = backslashes; j > 0; j--)
		*p++ = '\\';
	      *p++ = '"';
	    }
	  *p = '\0';

	  new_argv[i] = quoted_string;
	}
      else
	new_argv[i] = (char *) string;
    }
  new_argv[argc] = NULL;

  return new_argv;
}
EOF
		;;
	    esac

            cat <<"EOF"
void lt_dump_script (FILE* f)
{
EOF
	    func_emit_wrapper yes |
	      $SED -n -e '
s/^\(.\{79\}\)\(..*\)/\1\
\2/
h
s/\([\\"]\)/\\\1/g
s/$/\\n/
s/\([^\n]*\).*/  fputs ("\1", f);/p
g
D'
            cat <<"EOF"
}
EOF
}
# end: func_emit_cwrapperexe_src

# func_win32_import_lib_p ARG
# True if ARG is an import lib, as indicated by $file_magic_cmd
func_win32_import_lib_p ()
{
    $debug_cmd

    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
    *import*) : ;;
    *) false ;;
    esac
}

# func_suncc_cstd_abi
# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
# Several compiler flags select an ABI that is incompatible with the
# Cstd library. Avoid specifying it if any are in CXXFLAGS.
func_suncc_cstd_abi ()
{
    $debug_cmd

    case " $compile_command " in
    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
      suncc_use_cstd_abi=no
      ;;
    *)
      suncc_use_cstd_abi=yes
      ;;
    esac
}

# func_mode_link arg...
func_mode_link ()
{
    $debug_cmd

    case $host in
    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
      # It is impossible to link a dll without this setting, and
      # we shouldn't force the makefile maintainer to figure out
      # what system we are compiling for in order to pass an extra
      # flag for every libtool invocation.
      # allow_undefined=no

      # FIXME: Unfortunately, there are problems with the above when trying
      # to make a dll that has undefined symbols, in which case not
      # even a static library is built.  For now, we need to specify
      # -no-undefined on the libtool link line when we can be certain
      # that all symbols are satisfied, otherwise we get a static library.
      allow_undefined=yes
      ;;
    *)
      allow_undefined=yes
      ;;
    esac
    libtool_args=$nonopt
    base_compile="$nonopt $@"
    compile_command=$nonopt
    finalize_command=$nonopt

    compile_rpath=
    finalize_rpath=
    compile_shlibpath=
    finalize_shlibpath=
    convenience=
    old_convenience=
    deplibs=
    old_deplibs=
    compiler_flags=
    linker_flags=
    dllsearchpath=
    lib_search_path=`pwd`
    inst_prefix_dir=
    new_inherited_linker_flags=

    avoid_version=no
    bindir=
    dlfiles=
    dlprefiles=
    dlself=no
    export_dynamic=no
    export_symbols=
    export_symbols_regex=
    generated=
    libobjs=
    ltlibs=
    module=no
    no_install=no
    objs=
    os2dllname=
    non_pic_objects=
    precious_files_regex=
    prefer_static_libs=no
    preload=false
    prev=
    prevarg=
    release=
    rpath=
    xrpath=
    perm_rpath=
    temp_rpath=
    thread_safe=no
    vinfo=
    vinfo_number=no
    weak_libs=
    single_module=$wl-single_module
    func_infer_tag $base_compile

    # We need to know -static, to get the right output filenames.
    for arg
    do
      case $arg in
      -shared)
	test yes != "$build_libtool_libs" \
	  && func_fatal_configuration "cannot build a shared library"
	build_old_libs=no
	break
	;;
      -all-static | -static | -static-libtool-libs)
	case $arg in
	-all-static)
	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
	    func_warning "complete static linking is impossible in this configuration"
	  fi
	  if test -n "$link_static_flag"; then
	    dlopen_self=$dlopen_self_static
	  fi
	  prefer_static_libs=yes
	  ;;
	-static)
	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
	    dlopen_self=$dlopen_self_static
	  fi
	  prefer_static_libs=built
	  ;;
	-static-libtool-libs)
	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
	    dlopen_self=$dlopen_self_static
	  fi
	  prefer_static_libs=yes
	  ;;
	esac
	build_libtool_libs=no
	build_old_libs=yes
	break
	;;
      esac
    done

    # See if our shared archives depend on static archives.
    test -n "$old_archive_from_new_cmds" && build_old_libs=yes

    # Go through the arguments, transforming them on the way.
    while test "$#" -gt 0; do
      arg=$1
      shift
      func_quote_for_eval "$arg"
      qarg=$func_quote_for_eval_unquoted_result
      func_append libtool_args " $func_quote_for_eval_result"

      # If the previous option needs an argument, assign it.
      if test -n "$prev"; then
	case $prev in
	output)
	  func_append compile_command " @OUTPUT@"
	  func_append finalize_command " @OUTPUT@"
	  ;;
	esac

	case $prev in
	bindir)
	  bindir=$arg
	  prev=
	  continue
	  ;;
	dlfiles|dlprefiles)
	  $preload || {
	    # Add the symbol object into the linking commands.
	    func_append compile_command " @SYMFILE@"
	    func_append finalize_command " @SYMFILE@"
	    preload=:
	  }
	  case $arg in
	  *.la | *.lo) ;;  # We handle these cases below.
	  force)
	    if test no = "$dlself"; then
	      dlself=needless
	      export_dynamic=yes
	    fi
	    prev=
	    continue
	    ;;
	  self)
	    if test dlprefiles = "$prev"; then
	      dlself=yes
	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
	      dlself=yes
	    else
	      dlself=needless
	      export_dynamic=yes
	    fi
	    prev=
	    continue
	    ;;
	  *)
	    if test dlfiles = "$prev"; then
	      func_append dlfiles " $arg"
	    else
	      func_append dlprefiles " $arg"
	    fi
	    prev=
	    continue
	    ;;
	  esac
	  ;;
	expsyms)
	  export_symbols=$arg
	  test -f "$arg" \
	    || func_fatal_error "symbol file '$arg' does not exist"
	  prev=
	  continue
	  ;;
	expsyms_regex)
	  export_symbols_regex=$arg
	  prev=
	  continue
	  ;;
	framework)
	  case $host in
	    *-*-darwin*)
	      case "$deplibs " in
		*" $qarg.ltframework "*) ;;
		*) func_append deplibs " $qarg.ltframework" # this is fixed later
		   ;;
	      esac
	      ;;
	  esac
	  prev=
	  continue
	  ;;
	inst_prefix)
	  inst_prefix_dir=$arg
	  prev=
	  continue
	  ;;
	mllvm)
	  # Clang does not use LLVM to link, so we can simply discard any
	  # '-mllvm $arg' options when doing the link step.
	  prev=
	  continue
	  ;;
	objectlist)
	  if test -f "$arg"; then
	    save_arg=$arg
	    moreargs=
	    for fil in `cat "$save_arg"`
	    do
#	      func_append moreargs " $fil"
	      arg=$fil
	      # A libtool-controlled object.

	      # Check to see that this really is a libtool object.
	      if func_lalib_unsafe_p "$arg"; then
		pic_object=
		non_pic_object=

		# Read the .lo file
		func_source "$arg"

		if test -z "$pic_object" ||
		   test -z "$non_pic_object" ||
		   test none = "$pic_object" &&
		   test none = "$non_pic_object"; then
		  func_fatal_error "cannot find name of object for '$arg'"
		fi

		# Extract subdirectory from the argument.
		func_dirname "$arg" "/" ""
		xdir=$func_dirname_result

		if test none != "$pic_object"; then
		  # Prepend the subdirectory the object is found in.
		  pic_object=$xdir$pic_object

		  if test dlfiles = "$prev"; then
		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
		      func_append dlfiles " $pic_object"
		      prev=
		      continue
		    else
		      # If libtool objects are unsupported, then we need to preload.
		      prev=dlprefiles
		    fi
		  fi

		  # CHECK ME:  I think I busted this.  -Ossama
		  if test dlprefiles = "$prev"; then
		    # Preload the old-style object.
		    func_append dlprefiles " $pic_object"
		    prev=
		  fi

		  # A PIC object.
		  func_append libobjs " $pic_object"
		  arg=$pic_object
		fi

		# Non-PIC object.
		if test none != "$non_pic_object"; then
		  # Prepend the subdirectory the object is found in.
		  non_pic_object=$xdir$non_pic_object

		  # A standard non-PIC object
		  func_append non_pic_objects " $non_pic_object"
		  if test -z "$pic_object" || test none = "$pic_object"; then
		    arg=$non_pic_object
		  fi
		else
		  # If the PIC object exists, use it instead.
		  # $xdir was prepended to $pic_object above.
		  non_pic_object=$pic_object
		  func_append non_pic_objects " $non_pic_object"
		fi
	      else
		# Only an error if not doing a dry-run.
		if $opt_dry_run; then
		  # Extract subdirectory from the argument.
		  func_dirname "$arg" "/" ""
		  xdir=$func_dirname_result

		  func_lo2o "$arg"
		  pic_object=$xdir$objdir/$func_lo2o_result
		  non_pic_object=$xdir$func_lo2o_result
		  func_append libobjs " $pic_object"
		  func_append non_pic_objects " $non_pic_object"
	        else
		  func_fatal_error "'$arg' is not a valid libtool object"
		fi
	      fi
	    done
	  else
	    func_fatal_error "link input file '$arg' does not exist"
	  fi
	  arg=$save_arg
	  prev=
	  continue
	  ;;
	os2dllname)
	  os2dllname=$arg
	  prev=
	  continue
	  ;;
	precious_regex)
	  precious_files_regex=$arg
	  prev=
	  continue
	  ;;
	release)
	  release=-$arg
	  prev=
	  continue
	  ;;
	rpath | xrpath)
	  # We need an absolute path.
	  case $arg in
	  [\\/]* | [A-Za-z]:[\\/]*) ;;
	  *)
	    func_fatal_error "only absolute run-paths are allowed"
	    ;;
	  esac
	  if test rpath = "$prev"; then
	    case "$rpath " in
	    *" $arg "*) ;;
	    *) func_append rpath " $arg" ;;
	    esac
	  else
	    case "$xrpath " in
	    *" $arg "*) ;;
	    *) func_append xrpath " $arg" ;;
	    esac
	  fi
	  prev=
	  continue
	  ;;
	shrext)
	  shrext_cmds=$arg
	  prev=
	  continue
	  ;;
	weak)
	  func_append weak_libs " $arg"
	  prev=
	  continue
	  ;;
	xcclinker)
	  func_append linker_flags " $qarg"
	  func_append compiler_flags " $qarg"
	  prev=
	  func_append compile_command " $qarg"
	  func_append finalize_command " $qarg"
	  continue
	  ;;
	xcompiler)
	  func_append compiler_flags " $qarg"
	  prev=
	  func_append compile_command " $qarg"
	  func_append finalize_command " $qarg"
	  continue
	  ;;
	xlinker)
	  func_append linker_flags " $qarg"
	  func_append compiler_flags " $wl$qarg"
	  prev=
	  func_append compile_command " $wl$qarg"
	  func_append finalize_command " $wl$qarg"
	  continue
	  ;;
	*)
	  eval "$prev=\"\$arg\""
	  prev=
	  continue
	  ;;
	esac
      fi # test -n "$prev"

      prevarg=$arg

      case $arg in
      -all-static)
	if test -n "$link_static_flag"; then
	  # See comment for -static flag below, for more details.
	  func_append compile_command " $link_static_flag"
	  func_append finalize_command " $link_static_flag"
	fi
	continue
	;;

      -allow-undefined)
	# FIXME: remove this flag sometime in the future.
	func_fatal_error "'-allow-undefined' must not be used because it is the default"
	;;

      -avoid-version)
	avoid_version=yes
	continue
	;;

      -bindir)
	prev=bindir
	continue
	;;

      -dlopen)
	prev=dlfiles
	continue
	;;

      -dlpreopen)
	prev=dlprefiles
	continue
	;;

      -export-dynamic)
	export_dynamic=yes
	continue
	;;

      -export-symbols | -export-symbols-regex)
	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
	  func_fatal_error "more than one -exported-symbols argument is not allowed"
	fi
	if test X-export-symbols = "X$arg"; then
	  prev=expsyms
	else
	  prev=expsyms_regex
	fi
	continue
	;;

      -framework)
	prev=framework
	continue
	;;

      -inst-prefix-dir)
	prev=inst_prefix
	continue
	;;

      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
      # so, if we see these flags be careful not to treat them like -L
      -L[A-Z][A-Z]*:*)
	case $with_gcc/$host in
	no/*-*-irix* | /*-*-irix*)
	  func_append compile_command " $arg"
	  func_append finalize_command " $arg"
	  ;;
	esac
	continue
	;;

      -L*)
	func_stripname "-L" '' "$arg"
	if test -z "$func_stripname_result"; then
	  if test "$#" -gt 0; then
	    func_fatal_error "require no space between '-L' and '$1'"
	  else
	    func_fatal_error "need path for '-L' option"
	  fi
	fi
	func_resolve_sysroot "$func_stripname_result"
	dir=$func_resolve_sysroot_result
	# We need an absolute path.
	case $dir in
	[\\/]* | [A-Za-z]:[\\/]*) ;;
	*)
	  absdir=`cd "$dir" && pwd`
	  test -z "$absdir" && \
	    func_fatal_error "cannot determine absolute directory name of '$dir'"
	  dir=$absdir
	  ;;
	esac
	case "$deplibs " in
	*" -L$dir "* | *" $arg "*)
	  # Will only happen for absolute or sysroot arguments
	  ;;
	*)
	  # Preserve sysroot, but never include relative directories
	  case $dir in
	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
	    *) func_append deplibs " -L$dir" ;;
	  esac
	  func_append lib_search_path " $dir"
	  ;;
	esac
	case $host in
	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
	  case :$dllsearchpath: in
	  *":$dir:"*) ;;
	  ::) dllsearchpath=$dir;;
	  *) func_append dllsearchpath ":$dir";;
	  esac
	  case :$dllsearchpath: in
	  *":$testbindir:"*) ;;
	  ::) dllsearchpath=$testbindir;;
	  *) func_append dllsearchpath ":$testbindir";;
	  esac
	  ;;
	esac
	continue
	;;

      -l*)
	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
	  case $host in
	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
	    # These systems don't actually have a C or math library (as such)
	    continue
	    ;;
	  *-*-os2*)
	    # These systems don't actually have a C library (as such)
	    test X-lc = "X$arg" && continue
	    ;;
	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
	    # Do not include libc due to us having libc/libc_r.
	    test X-lc = "X$arg" && continue
	    ;;
	  *-*-rhapsody* | *-*-darwin1.[012])
	    # Rhapsody C and math libraries are in the System framework
	    func_append deplibs " System.ltframework"
	    continue
	    ;;
	  *-*-sco3.2v5* | *-*-sco5v6*)
	    # Causes problems with __ctype
	    test X-lc = "X$arg" && continue
	    ;;
	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
	    # Compiler inserts libc in the correct place for threads to work
	    test X-lc = "X$arg" && continue
	    ;;
	  esac
	elif test X-lc_r = "X$arg"; then
	 case $host in
	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
	   # Do not include libc_r directly, use -pthread flag.
	   continue
	   ;;
	 esac
	fi
	func_append deplibs " $arg"
	continue
	;;

      -mllvm)
	prev=mllvm
	continue
	;;

      -module)
	module=yes
	continue
	;;

      # Tru64 UNIX uses -model [arg] to determine the layout of C++
      # classes, name mangling, and exception handling.
      # Darwin uses the -arch flag to determine output architecture.
      -model|-arch|-isysroot|--sysroot)
	func_append compiler_flags " $arg"
	func_append compile_command " $arg"
	func_append finalize_command " $arg"
	prev=xcompiler
	continue
	;;

      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
	func_append compiler_flags " $arg"
	func_append compile_command " $arg"
	func_append finalize_command " $arg"
	case "$new_inherited_linker_flags " in
	    *" $arg "*) ;;
	    * ) func_append new_inherited_linker_flags " $arg" ;;
	esac
	continue
	;;

      -multi_module)
	single_module=$wl-multi_module
	continue
	;;

      -no-fast-install)
	fast_install=no
	continue
	;;

      -no-install)
	case $host in
	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
	  # The PATH hackery in wrapper scripts is required on Windows
	  # and Darwin in order for the loader to find any dlls it needs.
	  func_warning "'-no-install' is ignored for $host"
	  func_warning "assuming '-no-fast-install' instead"
	  fast_install=no
	  ;;
	*) no_install=yes ;;
	esac
	continue
	;;

      -no-undefined)
	allow_undefined=no
	continue
	;;

      -objectlist)
	prev=objectlist
	continue
	;;

      -os2dllname)
	prev=os2dllname
	continue
	;;

      -o) prev=output ;;

      -precious-files-regex)
	prev=precious_regex
	continue
	;;

      -release)
	prev=release
	continue
	;;

      -rpath)
	prev=rpath
	continue
	;;

      -R)
	prev=xrpath
	continue
	;;

      -R*)
	func_stripname '-R' '' "$arg"
	dir=$func_stripname_result
	# We need an absolute path.
	case $dir in
	[\\/]* | [A-Za-z]:[\\/]*) ;;
	=*)
	  func_stripname '=' '' "$dir"
	  dir=$lt_sysroot$func_stripname_result
	  ;;
	*)
	  func_fatal_error "only absolute run-paths are allowed"
	  ;;
	esac
	case "$xrpath " in
	*" $dir "*) ;;
	*) func_append xrpath " $dir" ;;
	esac
	continue
	;;

      -shared)
	# The effects of -shared are defined in a previous loop.
	continue
	;;

      -shrext)
	prev=shrext
	continue
	;;

      -static | -static-libtool-libs)
	# The effects of -static are defined in a previous loop.
	# We used to do the same as -all-static on platforms that
	# didn't have a PIC flag, but the assumption that the effects
	# would be equivalent was wrong.  It would break on at least
	# Digital Unix and AIX.
	continue
	;;

      -thread-safe)
	thread_safe=yes
	continue
	;;

      -version-info)
	prev=vinfo
	continue
	;;

      -version-number)
	prev=vinfo
	vinfo_number=yes
	continue
	;;

      -weak)
        prev=weak
	continue
	;;

      -Wc,*)
	func_stripname '-Wc,' '' "$arg"
	args=$func_stripname_result
	arg=
	save_ifs=$IFS; IFS=,
	for flag in $args; do
	  IFS=$save_ifs
          func_quote_for_eval "$flag"
	  func_append arg " $func_quote_for_eval_result"
	  func_append compiler_flags " $func_quote_for_eval_result"
	done
	IFS=$save_ifs
	func_stripname ' ' '' "$arg"
	arg=$func_stripname_result
	;;

      -Wl,*)
	func_stripname '-Wl,' '' "$arg"
	args=$func_stripname_result
	arg=
	save_ifs=$IFS; IFS=,
	for flag in $args; do
	  IFS=$save_ifs
          func_quote_for_eval "$flag"
	  func_append arg " $wl$func_quote_for_eval_result"
	  func_append compiler_flags " $wl$func_quote_for_eval_result"
	  func_append linker_flags " $func_quote_for_eval_result"
	done
	IFS=$save_ifs
	func_stripname ' ' '' "$arg"
	arg=$func_stripname_result
	;;

      -Xcompiler)
	prev=xcompiler
	continue
	;;

      -Xlinker)
	prev=xlinker
	continue
	;;

      -XCClinker)
	prev=xcclinker
	continue
	;;

      # -msg_* for osf cc
      -msg_*)
	func_quote_for_eval "$arg"
	arg=$func_quote_for_eval_result
	;;

      # Flags to be passed through unchanged, with rationale:
      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
      # -r[0-9][0-9]*        specify processor for the SGI compiler
      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
      # +DA*, +DD*           enable 64-bit mode for the HP compiler
      # -q*                  compiler args for the IBM compiler
      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
      # -F/path              path to uninstalled frameworks, gcc on darwin
      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
      # -fstack-protector*   stack protector flags for GCC
      # @file                GCC response files
      # -tp=*                Portland pgcc target processor selection
      # --sysroot=*          for sysroot support
      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
      # -specs=*             GCC specs files
      # -stdlib=*            select c++ std lib with clang
      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
      -specs=*)
        func_quote_for_eval "$arg"
	arg=$func_quote_for_eval_result
        func_append compile_command " $arg"
        func_append finalize_command " $arg"
        func_append compiler_flags " $arg"
        continue
        ;;

      -Z*)
        if test os2 = "`expr $host : '.*\(os2\)'`"; then
          # OS/2 uses -Zxxx to specify OS/2-specific options
	  compiler_flags="$compiler_flags $arg"
	  func_append compile_command " $arg"
	  func_append finalize_command " $arg"
	  case $arg in
	  -Zlinker | -Zstack)
	    prev=xcompiler
	    ;;
	  esac
	  continue
        else
	  # Otherwise treat like 'Some other compiler flag' below
	  func_quote_for_eval "$arg"
	  arg=$func_quote_for_eval_result
        fi
	;;

      # Some other compiler flag.
      -* | +*)
        func_quote_for_eval "$arg"
	arg=$func_quote_for_eval_result
	;;

      *.$objext)
	# A standard object.
	func_append objs " $arg"
	;;

      *.lo)
	# A libtool-controlled object.

	# Check to see that this really is a libtool object.
	if func_lalib_unsafe_p "$arg"; then
	  pic_object=
	  non_pic_object=

	  # Read the .lo file
	  func_source "$arg"

	  if test -z "$pic_object" ||
	     test -z "$non_pic_object" ||
	     test none = "$pic_object" &&
	     test none = "$non_pic_object"; then
	    func_fatal_error "cannot find name of object for '$arg'"
	  fi

	  # Extract subdirectory from the argument.
	  func_dirname "$arg" "/" ""
	  xdir=$func_dirname_result

	  test none = "$pic_object" || {
	    # Prepend the subdirectory the object is found in.
	    pic_object=$xdir$pic_object

	    if test dlfiles = "$prev"; then
	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
		func_append dlfiles " $pic_object"
		prev=
		continue
	      else
		# If libtool objects are unsupported, then we need to preload.
		prev=dlprefiles
	      fi
	    fi

	    # CHECK ME:  I think I busted this.  -Ossama
	    if test dlprefiles = "$prev"; then
	      # Preload the old-style object.
	      func_append dlprefiles " $pic_object"
	      prev=
	    fi

	    # A PIC object.
	    func_append libobjs " $pic_object"
	    arg=$pic_object
	  }

	  # Non-PIC object.
	  if test none != "$non_pic_object"; then
	    # Prepend the subdirectory the object is found in.
	    non_pic_object=$xdir$non_pic_object

	    # A standard non-PIC object
	    func_append non_pic_objects " $non_pic_object"
	    if test -z "$pic_object" || test none = "$pic_object"; then
	      arg=$non_pic_object
	    fi
	  else
	    # If the PIC object exists, use it instead.
	    # $xdir was prepended to $pic_object above.
	    non_pic_object=$pic_object
	    func_append non_pic_objects " $non_pic_object"
	  fi
	else
	  # Only an error if not doing a dry-run.
	  if $opt_dry_run; then
	    # Extract subdirectory from the argument.
	    func_dirname "$arg" "/" ""
	    xdir=$func_dirname_result

	    func_lo2o "$arg"
	    pic_object=$xdir$objdir/$func_lo2o_result
	    non_pic_object=$xdir$func_lo2o_result
	    func_append libobjs " $pic_object"
	    func_append non_pic_objects " $non_pic_object"
	  else
	    func_fatal_error "'$arg' is not a valid libtool object"
	  fi
	fi
	;;

      *.$libext)
	# An archive.
	func_append deplibs " $arg"
	func_append old_deplibs " $arg"
	continue
	;;

      *.la)
	# A libtool-controlled library.

	func_resolve_sysroot "$arg"
	if test dlfiles = "$prev"; then
	  # This library was specified with -dlopen.
	  func_append dlfiles " $func_resolve_sysroot_result"
	  prev=
	elif test dlprefiles = "$prev"; then
	  # The library was specified with -dlpreopen.
	  func_append dlprefiles " $func_resolve_sysroot_result"
	  prev=
	else
	  func_append deplibs " $func_resolve_sysroot_result"
	fi
	continue
	;;

      # Some other compiler argument.
      *)
	# Unknown arguments in both finalize_command and compile_command need
	# to be aesthetically quoted because they are evaled later.
	func_quote_for_eval "$arg"
	arg=$func_quote_for_eval_result
	;;
      esac # arg

      # Now actually substitute the argument into the commands.
      if test -n "$arg"; then
	func_append compile_command " $arg"
	func_append finalize_command " $arg"
      fi
    done # argument parsing loop

    test -n "$prev" && \
      func_fatal_help "the '$prevarg' option requires an argument"

    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
      eval arg=\"$export_dynamic_flag_spec\"
      func_append compile_command " $arg"
      func_append finalize_command " $arg"
    fi

    oldlibs=
    # calculate the name of the file, without its directory
    func_basename "$output"
    outputname=$func_basename_result
    libobjs_save=$libobjs

    if test -n "$shlibpath_var"; then
      # get the directories listed in $shlibpath_var
      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
    else
      shlib_search_path=
    fi
    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"

    # Definition is injected by LT_CONFIG during libtool generation.
    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"

    func_dirname "$output" "/" ""
    output_objdir=$func_dirname_result$objdir
    func_to_tool_file "$output_objdir/"
    tool_output_objdir=$func_to_tool_file_result
    # Create the object directory.
    func_mkdir_p "$output_objdir"

    # Determine the type of output
    case $output in
    "")
      func_fatal_help "you must specify an output file"
      ;;
    *.$libext) linkmode=oldlib ;;
    *.lo | *.$objext) linkmode=obj ;;
    *.la) linkmode=lib ;;
    *) linkmode=prog ;; # Anything else should be a program.
    esac

    specialdeplibs=

    libs=
    # Find all interdependent deplibs by searching for libraries
    # that are linked more than once (e.g. -la -lb -la)
    for deplib in $deplibs; do
      if $opt_preserve_dup_deps; then
	case "$libs " in
	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
	esac
      fi
      func_append libs " $deplib"
    done

    if test lib = "$linkmode"; then
      libs="$predeps $libs $compiler_lib_search_path $postdeps"

      # Compute libraries that are listed more than once in $predeps
      # $postdeps and mark them as special (i.e., whose duplicates are
      # not to be eliminated).
      pre_post_deps=
      if $opt_duplicate_compiler_generated_deps; then
	for pre_post_dep in $predeps $postdeps; do
	  case "$pre_post_deps " in
	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
	  esac
	  func_append pre_post_deps " $pre_post_dep"
	done
      fi
      pre_post_deps=
    fi

    deplibs=
    newdependency_libs=
    newlib_search_path=
    need_relink=no # whether we're linking any uninstalled libtool libraries
    notinst_deplibs= # not-installed libtool libraries
    notinst_path= # paths that contain not-installed libtool libraries

    case $linkmode in
    lib)
	passes="conv dlpreopen link"
	for file in $dlfiles $dlprefiles; do
	  case $file in
	  *.la) ;;
	  *)
	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
	    ;;
	  esac
	done
	;;
    prog)
	compile_deplibs=
	finalize_deplibs=
	alldeplibs=false
	newdlfiles=
	newdlprefiles=
	passes="conv scan dlopen dlpreopen link"
	;;
    *)  passes="conv"
	;;
    esac

    for pass in $passes; do
      # The preopen pass in lib mode reverses $deplibs; put it back here
      # so that -L comes before libs that need it for instance...
      if test lib,link = "$linkmode,$pass"; then
	## FIXME: Find the place where the list is rebuilt in the wrong
	##        order, and fix it there properly
        tmp_deplibs=
	for deplib in $deplibs; do
	  tmp_deplibs="$deplib $tmp_deplibs"
	done
	deplibs=$tmp_deplibs
      fi

      if test lib,link = "$linkmode,$pass" ||
	 test prog,scan = "$linkmode,$pass"; then
	libs=$deplibs
	deplibs=
      fi
      if test prog = "$linkmode"; then
	case $pass in
	dlopen) libs=$dlfiles ;;
	dlpreopen) libs=$dlprefiles ;;
	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
	esac
      fi
      if test lib,dlpreopen = "$linkmode,$pass"; then
	# Collect and forward deplibs of preopened libtool libs
	for lib in $dlprefiles; do
	  # Ignore non-libtool-libs
	  dependency_libs=
	  func_resolve_sysroot "$lib"
	  case $lib in
	  *.la)	func_source "$func_resolve_sysroot_result" ;;
	  esac

	  # Collect preopened libtool deplibs, except any this library
	  # has declared as weak libs
	  for deplib in $dependency_libs; do
	    func_basename "$deplib"
            deplib_base=$func_basename_result
	    case " $weak_libs " in
	    *" $deplib_base "*) ;;
	    *) func_append deplibs " $deplib" ;;
	    esac
	  done
	done
	libs=$dlprefiles
      fi
      if test dlopen = "$pass"; then
	# Collect dlpreopened libraries
	save_deplibs=$deplibs
	deplibs=
      fi

      for deplib in $libs; do
	lib=
	found=false
	case $deplib in
	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
	  if test prog,link = "$linkmode,$pass"; then
	    compile_deplibs="$deplib $compile_deplibs"
	    finalize_deplibs="$deplib $finalize_deplibs"
	  else
	    func_append compiler_flags " $deplib"
	    if test lib = "$linkmode"; then
		case "$new_inherited_linker_flags " in
		    *" $deplib "*) ;;
		    * ) func_append new_inherited_linker_flags " $deplib" ;;
		esac
	    fi
	  fi
	  continue
	  ;;
	-l*)
	  if test lib != "$linkmode" && test prog != "$linkmode"; then
	    func_warning "'-l' is ignored for archives/objects"
	    continue
	  fi
	  func_stripname '-l' '' "$deplib"
	  name=$func_stripname_result
	  if test lib = "$linkmode"; then
	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
	  else
	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
	  fi
	  for searchdir in $searchdirs; do
	    for search_ext in .la $std_shrext .so .a; do
	      # Search the libtool library
	      lib=$searchdir/lib$name$search_ext
	      if test -f "$lib"; then
		if test .la = "$search_ext"; then
		  found=:
		else
		  found=false
		fi
		break 2
	      fi
	    done
	  done
	  if $found; then
	    # deplib is a libtool library
	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
	    # We need to do some special things here, and not later.
	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
	      case " $predeps $postdeps " in
	      *" $deplib "*)
		if func_lalib_p "$lib"; then
		  library_names=
		  old_library=
		  func_source "$lib"
		  for l in $old_library $library_names; do
		    ll=$l
		  done
		  if test "X$ll" = "X$old_library"; then # only static version available
		    found=false
		    func_dirname "$lib" "" "."
		    ladir=$func_dirname_result
		    lib=$ladir/$old_library
		    if test prog,link = "$linkmode,$pass"; then
		      compile_deplibs="$deplib $compile_deplibs"
		      finalize_deplibs="$deplib $finalize_deplibs"
		    else
		      deplibs="$deplib $deplibs"
		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
		    fi
		    continue
		  fi
		fi
		;;
	      *) ;;
	      esac
	    fi
	  else
	    # deplib doesn't seem to be a libtool library
	    if test prog,link = "$linkmode,$pass"; then
	      compile_deplibs="$deplib $compile_deplibs"
	      finalize_deplibs="$deplib $finalize_deplibs"
	    else
	      deplibs="$deplib $deplibs"
	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
	    fi
	    continue
	  fi
	  ;; # -l
	*.ltframework)
	  if test prog,link = "$linkmode,$pass"; then
	    compile_deplibs="$deplib $compile_deplibs"
	    finalize_deplibs="$deplib $finalize_deplibs"
	  else
	    deplibs="$deplib $deplibs"
	    if test lib = "$linkmode"; then
		case "$new_inherited_linker_flags " in
		    *" $deplib "*) ;;
		    * ) func_append new_inherited_linker_flags " $deplib" ;;
		esac
	    fi
	  fi
	  continue
	  ;;
	-L*)
	  case $linkmode in
	  lib)
	    deplibs="$deplib $deplibs"
	    test conv = "$pass" && continue
	    newdependency_libs="$deplib $newdependency_libs"
	    func_stripname '-L' '' "$deplib"
	    func_resolve_sysroot "$func_stripname_result"
	    func_append newlib_search_path " $func_resolve_sysroot_result"
	    ;;
	  prog)
	    if test conv = "$pass"; then
	      deplibs="$deplib $deplibs"
	      continue
	    fi
	    if test scan = "$pass"; then
	      deplibs="$deplib $deplibs"
	    else
	      compile_deplibs="$deplib $compile_deplibs"
	      finalize_deplibs="$deplib $finalize_deplibs"
	    fi
	    func_stripname '-L' '' "$deplib"
	    func_resolve_sysroot "$func_stripname_result"
	    func_append newlib_search_path " $func_resolve_sysroot_result"
	    ;;
	  *)
	    func_warning "'-L' is ignored for archives/objects"
	    ;;
	  esac # linkmode
	  continue
	  ;; # -L
	-R*)
	  if test link = "$pass"; then
	    func_stripname '-R' '' "$deplib"
	    func_resolve_sysroot "$func_stripname_result"
	    dir=$func_resolve_sysroot_result
	    # Make sure the xrpath contains only unique directories.
	    case "$xrpath " in
	    *" $dir "*) ;;
	    *) func_append xrpath " $dir" ;;
	    esac
	  fi
	  deplibs="$deplib $deplibs"
	  continue
	  ;;
	*.la)
	  func_resolve_sysroot "$deplib"
	  lib=$func_resolve_sysroot_result
	  ;;
	*.$libext)
	  if test conv = "$pass"; then
	    deplibs="$deplib $deplibs"
	    continue
	  fi
	  case $linkmode in
	  lib)
	    # Linking convenience modules into shared libraries is allowed,
	    # but linking other static libraries is non-portable.
	    case " $dlpreconveniencelibs " in
	    *" $deplib "*) ;;
	    *)
	      valid_a_lib=false
	      case $deplibs_check_method in
		match_pattern*)
		  set dummy $deplibs_check_method; shift
		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
		    | $EGREP "$match_pattern_regex" > /dev/null; then
		    valid_a_lib=:
		  fi
		;;
		pass_all)
		  valid_a_lib=:
		;;
	      esac
	      if $valid_a_lib; then
		echo
		$ECHO "*** Warning: Linking the shared library $output against the"
		$ECHO "*** static library $deplib is not portable!"
		deplibs="$deplib $deplibs"
	      else
		echo
		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
		echo "*** I have the capability to make that library automatically link in when"
		echo "*** you link to this library.  But I can only do this if you have a"
		echo "*** shared version of the library, which you do not appear to have"
		echo "*** because the file extensions .$libext of this argument makes me believe"
		echo "*** that it is just a static archive that I should not use here."
	      fi
	      ;;
	    esac
	    continue
	    ;;
	  prog)
	    if test link != "$pass"; then
	      deplibs="$deplib $deplibs"
	    else
	      compile_deplibs="$deplib $compile_deplibs"
	      finalize_deplibs="$deplib $finalize_deplibs"
	    fi
	    continue
	    ;;
	  esac # linkmode
	  ;; # *.$libext
	*.lo | *.$objext)
	  if test conv = "$pass"; then
	    deplibs="$deplib $deplibs"
	  elif test prog = "$linkmode"; then
	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
	      # If there is no dlopen support or we're linking statically,
	      # we need to preload.
	      func_append newdlprefiles " $deplib"
	      compile_deplibs="$deplib $compile_deplibs"
	      finalize_deplibs="$deplib $finalize_deplibs"
	    else
	      func_append newdlfiles " $deplib"
	    fi
	  fi
	  continue
	  ;;
	%DEPLIBS%)
	  alldeplibs=:
	  continue
	  ;;
	esac # case $deplib

	$found || test -f "$lib" \
	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"

	# Check to see that this really is a libtool archive.
	func_lalib_unsafe_p "$lib" \
	  || func_fatal_error "'$lib' is not a valid libtool archive"

	func_dirname "$lib" "" "."
	ladir=$func_dirname_result

	dlname=
	dlopen=
	dlpreopen=
	libdir=
	library_names=
	old_library=
	inherited_linker_flags=
	# If the library was installed with an old release of libtool,
	# it will not redefine variables installed, or shouldnotlink
	installed=yes
	shouldnotlink=no
	avoidtemprpath=


	# Read the .la file
	func_source "$lib"

	# Convert "-framework foo" to "foo.ltframework"
	if test -n "$inherited_linker_flags"; then
	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
	    case " $new_inherited_linker_flags " in
	      *" $tmp_inherited_linker_flag "*) ;;
	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
	    esac
	  done
	fi
	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
	if test lib,link = "$linkmode,$pass" ||
	   test prog,scan = "$linkmode,$pass" ||
	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
	  test -n "$dlopen" && func_append dlfiles " $dlopen"
	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
	fi

	if test conv = "$pass"; then
	  # Only check for convenience libraries
	  deplibs="$lib $deplibs"
	  if test -z "$libdir"; then
	    if test -z "$old_library"; then
	      func_fatal_error "cannot find name of link library for '$lib'"
	    fi
	    # It is a libtool convenience library, so add in its objects.
	    func_append convenience " $ladir/$objdir/$old_library"
	    func_append old_convenience " $ladir/$objdir/$old_library"
	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
	    func_fatal_error "'$lib' is not a convenience library"
	  fi
	  tmp_libs=
	  for deplib in $dependency_libs; do
	    deplibs="$deplib $deplibs"
	    if $opt_preserve_dup_deps; then
	      case "$tmp_libs " in
	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
	      esac
	    fi
	    func_append tmp_libs " $deplib"
	  done
	  continue
	fi # $pass = conv


	# Get the name of the library we link against.
	linklib=
	if test -n "$old_library" &&
	   { test yes = "$prefer_static_libs" ||
	     test built,no = "$prefer_static_libs,$installed"; }; then
	  linklib=$old_library
	else
	  for l in $old_library $library_names; do
	    linklib=$l
	  done
	fi
	if test -z "$linklib"; then
	  func_fatal_error "cannot find name of link library for '$lib'"
	fi

	# This library was specified with -dlopen.
	if test dlopen = "$pass"; then
	  test -z "$libdir" \
	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
	  if test -z "$dlname" ||
	     test yes != "$dlopen_support" ||
	     test no = "$build_libtool_libs"
	  then
	    # If there is no dlname, no dlopen support or we're linking
	    # statically, we need to preload.  We also need to preload any
	    # dependent libraries so libltdl's deplib preloader doesn't
	    # bomb out in the load deplibs phase.
	    func_append dlprefiles " $lib $dependency_libs"
	  else
	    func_append newdlfiles " $lib"
	  fi
	  continue
	fi # $pass = dlopen

	# We need an absolute path.
	case $ladir in
	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
	*)
	  abs_ladir=`cd "$ladir" && pwd`
	  if test -z "$abs_ladir"; then
	    func_warning "cannot determine absolute directory name of '$ladir'"
	    func_warning "passing it literally to the linker, although it might fail"
	    abs_ladir=$ladir
	  fi
	  ;;
	esac
	func_basename "$lib"
	laname=$func_basename_result

	# Find the relevant object directory and library name.
	if test yes = "$installed"; then
	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
	    func_warning "library '$lib' was moved."
	    dir=$ladir
	    absdir=$abs_ladir
	    libdir=$abs_ladir
	  else
	    dir=$lt_sysroot$libdir
	    absdir=$lt_sysroot$libdir
	  fi
	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
	else
	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
	    dir=$ladir
	    absdir=$abs_ladir
	    # Remove this search path later
	    func_append notinst_path " $abs_ladir"
	  else
	    dir=$ladir/$objdir
	    absdir=$abs_ladir/$objdir
	    # Remove this search path later
	    func_append notinst_path " $abs_ladir"
	  fi
	fi # $installed = yes
	func_stripname 'lib' '.la' "$laname"
	name=$func_stripname_result

	# This library was specified with -dlpreopen.
	if test dlpreopen = "$pass"; then
	  if test -z "$libdir" && test prog = "$linkmode"; then
	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
	  fi
	  case $host in
	    # special handling for platforms with PE-DLLs.
	    *cygwin* | *mingw* | *cegcc* )
	      # Linker will automatically link against shared library if both
	      # static and shared are present.  Therefore, ensure we extract
	      # symbols from the import library if a shared library is present
	      # (otherwise, the dlopen module name will be incorrect).  We do
	      # this by putting the import library name into $newdlprefiles.
	      # We recover the dlopen module name by 'saving' the la file
	      # name in a special purpose variable, and (later) extracting the
	      # dlname from the la file.
	      if test -n "$dlname"; then
	        func_tr_sh "$dir/$linklib"
	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
	        func_append newdlprefiles " $dir/$linklib"
	      else
	        func_append newdlprefiles " $dir/$old_library"
	        # Keep a list of preopened convenience libraries to check
	        # that they are being used correctly in the link pass.
	        test -z "$libdir" && \
	          func_append dlpreconveniencelibs " $dir/$old_library"
	      fi
	    ;;
	    * )
	      # Prefer using a static library (so that no silly _DYNAMIC symbols
	      # are required to link).
	      if test -n "$old_library"; then
	        func_append newdlprefiles " $dir/$old_library"
	        # Keep a list of preopened convenience libraries to check
	        # that they are being used correctly in the link pass.
	        test -z "$libdir" && \
	          func_append dlpreconveniencelibs " $dir/$old_library"
	      # Otherwise, use the dlname, so that lt_dlopen finds it.
	      elif test -n "$dlname"; then
	        func_append newdlprefiles " $dir/$dlname"
	      else
	        func_append newdlprefiles " $dir/$linklib"
	      fi
	    ;;
	  esac
	fi # $pass = dlpreopen

	if test -z "$libdir"; then
	  # Link the convenience library
	  if test lib = "$linkmode"; then
	    deplibs="$dir/$old_library $deplibs"
	  elif test prog,link = "$linkmode,$pass"; then
	    compile_deplibs="$dir/$old_library $compile_deplibs"
	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
	  else
	    deplibs="$lib $deplibs" # used for prog,scan pass
	  fi
	  continue
	fi


	if test prog = "$linkmode" && test link != "$pass"; then
	  func_append newlib_search_path " $ladir"
	  deplibs="$lib $deplibs"

	  linkalldeplibs=false
	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
	     test no = "$build_libtool_libs"; then
	    linkalldeplibs=:
	  fi

	  tmp_libs=
	  for deplib in $dependency_libs; do
	    case $deplib in
	    -L*) func_stripname '-L' '' "$deplib"
	         func_resolve_sysroot "$func_stripname_result"
	         func_append newlib_search_path " $func_resolve_sysroot_result"
		 ;;
	    esac
	    # Need to link against all dependency_libs?
	    if $linkalldeplibs; then
	      deplibs="$deplib $deplibs"
	    else
	      # Need to hardcode shared library paths
	      # or/and link against static libraries
	      newdependency_libs="$deplib $newdependency_libs"
	    fi
	    if $opt_preserve_dup_deps; then
	      case "$tmp_libs " in
	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
	      esac
	    fi
	    func_append tmp_libs " $deplib"
	  done # for deplib
	  continue
	fi # $linkmode = prog...

	if test prog,link = "$linkmode,$pass"; then
	  if test -n "$library_names" &&
	     { { test no = "$prefer_static_libs" ||
	         test built,yes = "$prefer_static_libs,$installed"; } ||
	       test -z "$old_library"; }; then
	    # We need to hardcode the library path
	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
	      # Make sure the rpath contains only unique directories.
	      case $temp_rpath: in
	      *"$absdir:"*) ;;
	      *) func_append temp_rpath "$absdir:" ;;
	      esac
	    fi

	    # Hardcode the library path.
	    # Skip directories that are in the system default run-time
	    # search path.
	    case " $sys_lib_dlsearch_path " in
	    *" $absdir "*) ;;
	    *)
	      case "$compile_rpath " in
	      *" $absdir "*) ;;
	      *) func_append compile_rpath " $absdir" ;;
	      esac
	      ;;
	    esac
	    case " $sys_lib_dlsearch_path " in
	    *" $libdir "*) ;;
	    *)
	      case "$finalize_rpath " in
	      *" $libdir "*) ;;
	      *) func_append finalize_rpath " $libdir" ;;
	      esac
	      ;;
	    esac
	  fi # $linkmode,$pass = prog,link...

	  if $alldeplibs &&
	     { test pass_all = "$deplibs_check_method" ||
	       { test yes = "$build_libtool_libs" &&
		 test -n "$library_names"; }; }; then
	    # We only need to search for static libraries
	    continue
	  fi
	fi

	link_static=no # Whether the deplib will be linked statically
	use_static_libs=$prefer_static_libs
	if test built = "$use_static_libs" && test yes = "$installed"; then
	  use_static_libs=no
	fi
	if test -n "$library_names" &&
	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
	  case $host in
	  *cygwin* | *mingw* | *cegcc* | *os2*)
	      # No point in relinking DLLs because paths are not encoded
	      func_append notinst_deplibs " $lib"
	      need_relink=no
	    ;;
	  *)
	    if test no = "$installed"; then
	      func_append notinst_deplibs " $lib"
	      need_relink=yes
	    fi
	    ;;
	  esac
	  # This is a shared library

	  # Warn about portability, can't link against -module's on some
	  # systems (darwin).  Don't bleat about dlopened modules though!
	  dlopenmodule=
	  for dlpremoduletest in $dlprefiles; do
	    if test "X$dlpremoduletest" = "X$lib"; then
	      dlopenmodule=$dlpremoduletest
	      break
	    fi
	  done
	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
	    echo
	    if test prog = "$linkmode"; then
	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
	    else
	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
	    fi
	    $ECHO "*** $linklib is not portable!"
	  fi
	  if test lib = "$linkmode" &&
	     test yes = "$hardcode_into_libs"; then
	    # Hardcode the library path.
	    # Skip directories that are in the system default run-time
	    # search path.
	    case " $sys_lib_dlsearch_path " in
	    *" $absdir "*) ;;
	    *)
	      case "$compile_rpath " in
	      *" $absdir "*) ;;
	      *) func_append compile_rpath " $absdir" ;;
	      esac
	      ;;
	    esac
	    case " $sys_lib_dlsearch_path " in
	    *" $libdir "*) ;;
	    *)
	      case "$finalize_rpath " in
	      *" $libdir "*) ;;
	      *) func_append finalize_rpath " $libdir" ;;
	      esac
	      ;;
	    esac
	  fi

	  if test -n "$old_archive_from_expsyms_cmds"; then
	    # figure out the soname
	    set dummy $library_names
	    shift
	    realname=$1
	    shift
	    libname=`eval "\\$ECHO \"$libname_spec\""`
	    # use dlname if we got it. it's perfectly good, no?
	    if test -n "$dlname"; then
	      soname=$dlname
	    elif test -n "$soname_spec"; then
	      # bleh windows
	      case $host in
	      *cygwin* | mingw* | *cegcc* | *os2*)
	        func_arith $current - $age
		major=$func_arith_result
		versuffix=-$major
		;;
	      esac
	      eval soname=\"$soname_spec\"
	    else
	      soname=$realname
	    fi

	    # Make a new name for the extract_expsyms_cmds to use
	    soroot=$soname
	    func_basename "$soroot"
	    soname=$func_basename_result
	    func_stripname 'lib' '.dll' "$soname"
	    newlib=libimp-$func_stripname_result.a

	    # If the library has no export list, then create one now
	    if test -f "$output_objdir/$soname-def"; then :
	    else
	      func_verbose "extracting exported symbol list from '$soname'"
	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
	    fi

	    # Create $newlib
	    if test -f "$output_objdir/$newlib"; then :; else
	      func_verbose "generating import library for '$soname'"
	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
	    fi
	    # make sure the library variables are pointing to the new library
	    dir=$output_objdir
	    linklib=$newlib
	  fi # test -n "$old_archive_from_expsyms_cmds"

	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
	    add_shlibpath=
	    add_dir=
	    add=
	    lib_linked=yes
	    case $hardcode_action in
	    immediate | unsupported)
	      if test no = "$hardcode_direct"; then
		add=$dir/$linklib
		case $host in
		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
		    *-*-unixware7*) add_dir=-L$dir ;;
		  *-*-darwin* )
		    # if the lib is a (non-dlopened) module then we cannot
		    # link against it, someone is ignoring the earlier warnings
		    if /usr/bin/file -L $add 2> /dev/null |
			 $GREP ": [^:]* bundle" >/dev/null; then
		      if test "X$dlopenmodule" != "X$lib"; then
			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
			if test -z "$old_library"; then
			  echo
			  echo "*** And there doesn't seem to be a static archive available"
			  echo "*** The link will probably fail, sorry"
			else
			  add=$dir/$old_library
			fi
		      elif test -n "$old_library"; then
			add=$dir/$old_library
		      fi
		    fi
		esac
	      elif test no = "$hardcode_minus_L"; then
		case $host in
		*-*-sunos*) add_shlibpath=$dir ;;
		esac
		add_dir=-L$dir
		add=-l$name
	      elif test no = "$hardcode_shlibpath_var"; then
		add_shlibpath=$dir
		add=-l$name
	      else
		lib_linked=no
	      fi
	      ;;
	    relink)
	      if test yes = "$hardcode_direct" &&
	         test no = "$hardcode_direct_absolute"; then
		add=$dir/$linklib
	      elif test yes = "$hardcode_minus_L"; then
		add_dir=-L$absdir
		# Try looking first in the location we're being installed to.
		if test -n "$inst_prefix_dir"; then
		  case $libdir in
		    [\\/]*)
		      func_append add_dir " -L$inst_prefix_dir$libdir"
		      ;;
		  esac
		fi
		add=-l$name
	      elif test yes = "$hardcode_shlibpath_var"; then
		add_shlibpath=$dir
		add=-l$name
	      else
		lib_linked=no
	      fi
	      ;;
	    *) lib_linked=no ;;
	    esac

	    if test yes != "$lib_linked"; then
	      func_fatal_configuration "unsupported hardcode properties"
	    fi

	    if test -n "$add_shlibpath"; then
	      case :$compile_shlibpath: in
	      *":$add_shlibpath:"*) ;;
	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
	      esac
	    fi
	    if test prog = "$linkmode"; then
	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
	    else
	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
	      test -n "$add" && deplibs="$add $deplibs"
	      if test yes != "$hardcode_direct" &&
		 test yes != "$hardcode_minus_L" &&
		 test yes = "$hardcode_shlibpath_var"; then
		case :$finalize_shlibpath: in
		*":$libdir:"*) ;;
		*) func_append finalize_shlibpath "$libdir:" ;;
		esac
	      fi
	    fi
	  fi

	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
	    add_shlibpath=
	    add_dir=
	    add=
	    # Finalize command for both is simple: just hardcode it.
	    if test yes = "$hardcode_direct" &&
	       test no = "$hardcode_direct_absolute"; then
	      add=$libdir/$linklib
	    elif test yes = "$hardcode_minus_L"; then
	      add_dir=-L$libdir
	      add=-l$name
	    elif test yes = "$hardcode_shlibpath_var"; then
	      case :$finalize_shlibpath: in
	      *":$libdir:"*) ;;
	      *) func_append finalize_shlibpath "$libdir:" ;;
	      esac
	      add=-l$name
	    elif test yes = "$hardcode_automatic"; then
	      if test -n "$inst_prefix_dir" &&
		 test -f "$inst_prefix_dir$libdir/$linklib"; then
		add=$inst_prefix_dir$libdir/$linklib
	      else
		add=$libdir/$linklib
	      fi
	    else
	      # We cannot seem to hardcode it, guess we'll fake it.
	      add_dir=-L$libdir
	      # Try looking first in the location we're being installed to.
	      if test -n "$inst_prefix_dir"; then
		case $libdir in
		  [\\/]*)
		    func_append add_dir " -L$inst_prefix_dir$libdir"
		    ;;
		esac
	      fi
	      add=-l$name
	    fi

	    if test prog = "$linkmode"; then
	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
	    else
	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
	      test -n "$add" && deplibs="$add $deplibs"
	    fi
	  fi
	elif test prog = "$linkmode"; then
	  # Here we assume that one of hardcode_direct or hardcode_minus_L
	  # is not unsupported.  This is valid on all known static and
	  # shared platforms.
	  if test unsupported != "$hardcode_direct"; then
	    test -n "$old_library" && linklib=$old_library
	    compile_deplibs="$dir/$linklib $compile_deplibs"
	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
	  else
	    compile_deplibs="-l$name -L$dir $compile_deplibs"
	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
	  fi
	elif test yes = "$build_libtool_libs"; then
	  # Not a shared library
	  if test pass_all != "$deplibs_check_method"; then
	    # We're trying link a shared library against a static one
	    # but the system doesn't support it.

	    # Just print a warning and add the library to dependency_libs so
	    # that the program can be linked against the static library.
	    echo
	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
	    echo "*** I have the capability to make that library automatically link in when"
	    echo "*** you link to this library.  But I can only do this if you have a"
	    echo "*** shared version of the library, which you do not appear to have."
	    if test yes = "$module"; then
	      echo "*** But as you try to build a module library, libtool will still create "
	      echo "*** a static module, that should work as long as the dlopening application"
	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
	      if test -z "$global_symbol_pipe"; then
		echo
		echo "*** However, this would only work if libtool was able to extract symbol"
		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
		echo "*** not find such a program.  So, this module is probably useless."
		echo "*** 'nm' from GNU binutils and a full rebuild may help."
	      fi
	      if test no = "$build_old_libs"; then
		build_libtool_libs=module
		build_old_libs=yes
	      else
		build_libtool_libs=no
	      fi
	    fi
	  else
	    deplibs="$dir/$old_library $deplibs"
	    link_static=yes
	  fi
	fi # link shared/static library?

	if test lib = "$linkmode"; then
	  if test -n "$dependency_libs" &&
	     { test yes != "$hardcode_into_libs" ||
	       test yes = "$build_old_libs" ||
	       test yes = "$link_static"; }; then
	    # Extract -R from dependency_libs
	    temp_deplibs=
	    for libdir in $dependency_libs; do
	      case $libdir in
	      -R*) func_stripname '-R' '' "$libdir"
	           temp_xrpath=$func_stripname_result
		   case " $xrpath " in
		   *" $temp_xrpath "*) ;;
		   *) func_append xrpath " $temp_xrpath";;
		   esac;;
	      *) func_append temp_deplibs " $libdir";;
	      esac
	    done
	    dependency_libs=$temp_deplibs
	  fi

	  func_append newlib_search_path " $absdir"
	  # Link against this library
	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
	  # ... and its dependency_libs
	  tmp_libs=
	  for deplib in $dependency_libs; do
	    newdependency_libs="$deplib $newdependency_libs"
	    case $deplib in
              -L*) func_stripname '-L' '' "$deplib"
                   func_resolve_sysroot "$func_stripname_result";;
              *) func_resolve_sysroot "$deplib" ;;
            esac
	    if $opt_preserve_dup_deps; then
	      case "$tmp_libs " in
	      *" $func_resolve_sysroot_result "*)
                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
	      esac
	    fi
	    func_append tmp_libs " $func_resolve_sysroot_result"
	  done

	  if test no != "$link_all_deplibs"; then
	    # Add the search paths of all dependency libraries
	    for deplib in $dependency_libs; do
	      path=
	      case $deplib in
	      -L*) path=$deplib ;;
	      *.la)
	        func_resolve_sysroot "$deplib"
	        deplib=$func_resolve_sysroot_result
	        func_dirname "$deplib" "" "."
		dir=$func_dirname_result
		# We need an absolute path.
		case $dir in
		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
		*)
		  absdir=`cd "$dir" && pwd`
		  if test -z "$absdir"; then
		    func_warning "cannot determine absolute directory name of '$dir'"
		    absdir=$dir
		  fi
		  ;;
		esac
		if $GREP "^installed=no" $deplib > /dev/null; then
		case $host in
		*-*-darwin*)
		  depdepl=
		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
		  if test -n "$deplibrary_names"; then
		    for tmp in $deplibrary_names; do
		      depdepl=$tmp
		    done
		    if test -f "$absdir/$objdir/$depdepl"; then
		      depdepl=$absdir/$objdir/$depdepl
		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
                      if test -z "$darwin_install_name"; then
                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                      fi
		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
		      path=
		    fi
		  fi
		  ;;
		*)
		  path=-L$absdir/$objdir
		  ;;
		esac
		else
		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
		  test -z "$libdir" && \
		    func_fatal_error "'$deplib' is not a valid libtool archive"
		  test "$absdir" != "$libdir" && \
		    func_warning "'$deplib' seems to be moved"

		  path=-L$absdir
		fi
		;;
	      esac
	      case " $deplibs " in
	      *" $path "*) ;;
	      *) deplibs="$path $deplibs" ;;
	      esac
	    done
	  fi # link_all_deplibs != no
	fi # linkmode = lib
      done # for deplib in $libs
      if test link = "$pass"; then
	if test prog = "$linkmode"; then
	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
	else
	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
	fi
      fi
      dependency_libs=$newdependency_libs
      if test dlpreopen = "$pass"; then
	# Link the dlpreopened libraries before other libraries
	for deplib in $save_deplibs; do
	  deplibs="$deplib $deplibs"
	done
      fi
      if test dlopen != "$pass"; then
	test conv = "$pass" || {
	  # Make sure lib_search_path contains only unique directories.
	  lib_search_path=
	  for dir in $newlib_search_path; do
	    case "$lib_search_path " in
	    *" $dir "*) ;;
	    *) func_append lib_search_path " $dir" ;;
	    esac
	  done
	  newlib_search_path=
	}

	if test prog,link = "$linkmode,$pass"; then
	  vars="compile_deplibs finalize_deplibs"
	else
	  vars=deplibs
	fi
	for var in $vars dependency_libs; do
	  # Add libraries to $var in reverse order
	  eval tmp_libs=\"\$$var\"
	  new_libs=
	  for deplib in $tmp_libs; do
	    # FIXME: Pedantically, this is the right thing to do, so
	    #        that some nasty dependency loop isn't accidentally
	    #        broken:
	    #new_libs="$deplib $new_libs"
	    # Pragmatically, this seems to cause very few problems in
	    # practice:
	    case $deplib in
	    -L*) new_libs="$deplib $new_libs" ;;
	    -R*) ;;
	    *)
	      # And here is the reason: when a library appears more
	      # than once as an explicit dependence of a library, or
	      # is implicitly linked in more than once by the
	      # compiler, it is considered special, and multiple
	      # occurrences thereof are not removed.  Compare this
	      # with having the same library being listed as a
	      # dependency of multiple other libraries: in this case,
	      # we know (pedantically, we assume) the library does not
	      # need to be listed more than once, so we keep only the
	      # last copy.  This is not always right, but it is rare
	      # enough that we require users that really mean to play
	      # such unportable linking tricks to link the library
	      # using -Wl,-lname, so that libtool does not consider it
	      # for duplicate removal.
	      case " $specialdeplibs " in
	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
	      *)
		case " $new_libs " in
		*" $deplib "*) ;;
		*) new_libs="$deplib $new_libs" ;;
		esac
		;;
	      esac
	      ;;
	    esac
	  done
	  tmp_libs=
	  for deplib in $new_libs; do
	    case $deplib in
	    -L*)
	      case " $tmp_libs " in
	      *" $deplib "*) ;;
	      *) func_append tmp_libs " $deplib" ;;
	      esac
	      ;;
	    *) func_append tmp_libs " $deplib" ;;
	    esac
	  done
	  eval $var=\"$tmp_libs\"
	done # for var
      fi

      # Add Sun CC postdeps if required:
      test CXX = "$tagname" && {
        case $host_os in
        linux*)
          case `$CC -V 2>&1 | sed 5q` in
          *Sun\ C*) # Sun C++ 5.9
            func_suncc_cstd_abi

            if test no != "$suncc_use_cstd_abi"; then
              func_append postdeps ' -library=Cstd -library=Crun'
            fi
            ;;
          esac
          ;;

        solaris*)
          func_cc_basename "$CC"
          case $func_cc_basename_result in
          CC* | sunCC*)
            func_suncc_cstd_abi

            if test no != "$suncc_use_cstd_abi"; then
              func_append postdeps ' -library=Cstd -library=Crun'
            fi
            ;;
          esac
          ;;
        esac
      }

      # Last step: remove runtime libs from dependency_libs
      # (they stay in deplibs)
      tmp_libs=
      for i in $dependency_libs; do
	case " $predeps $postdeps $compiler_lib_search_path " in
	*" $i "*)
	  i=
	  ;;
	esac
	if test -n "$i"; then
	  func_append tmp_libs " $i"
	fi
      done
      dependency_libs=$tmp_libs
    done # for pass
    if test prog = "$linkmode"; then
      dlfiles=$newdlfiles
    fi
    if test prog = "$linkmode" || test lib = "$linkmode"; then
      dlprefiles=$newdlprefiles
    fi

    case $linkmode in
    oldlib)
      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
	func_warning "'-dlopen' is ignored for archives"
      fi

      case " $deplibs" in
      *\ -l* | *\ -L*)
	func_warning "'-l' and '-L' are ignored for archives" ;;
      esac

      test -n "$rpath" && \
	func_warning "'-rpath' is ignored for archives"

      test -n "$xrpath" && \
	func_warning "'-R' is ignored for archives"

      test -n "$vinfo" && \
	func_warning "'-version-info/-version-number' is ignored for archives"

      test -n "$release" && \
	func_warning "'-release' is ignored for archives"

      test -n "$export_symbols$export_symbols_regex" && \
	func_warning "'-export-symbols' is ignored for archives"

      # Now set the variables for building old libraries.
      build_libtool_libs=no
      oldlibs=$output
      func_append objs "$old_deplibs"
      ;;

    lib)
      # Make sure we only generate libraries of the form 'libNAME.la'.
      case $outputname in
      lib*)
	func_stripname 'lib' '.la' "$outputname"
	name=$func_stripname_result
	eval shared_ext=\"$shrext_cmds\"
	eval libname=\"$libname_spec\"
	;;
      *)
	test no = "$module" \
	  && func_fatal_help "libtool library '$output' must begin with 'lib'"

	if test no != "$need_lib_prefix"; then
	  # Add the "lib" prefix for modules if required
	  func_stripname '' '.la' "$outputname"
	  name=$func_stripname_result
	  eval shared_ext=\"$shrext_cmds\"
	  eval libname=\"$libname_spec\"
	else
	  func_stripname '' '.la' "$outputname"
	  libname=$func_stripname_result
	fi
	;;
      esac

      if test -n "$objs"; then
	if test pass_all != "$deplibs_check_method"; then
	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
	else
	  echo
	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
	  $ECHO "*** objects $objs is not portable!"
	  func_append libobjs " $objs"
	fi
      fi

      test no = "$dlself" \
	|| func_warning "'-dlopen self' is ignored for libtool libraries"

      set dummy $rpath
      shift
      test 1 -lt "$#" \
	&& func_warning "ignoring multiple '-rpath's for a libtool library"

      install_libdir=$1

      oldlibs=
      if test -z "$rpath"; then
	if test yes = "$build_libtool_libs"; then
	  # Building a libtool convenience library.
	  # Some compilers have problems with a '.al' extension so
	  # convenience libraries should have the same extension an
	  # archive normally would.
	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
	  build_libtool_libs=convenience
	  build_old_libs=yes
	fi

	test -n "$vinfo" && \
	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"

	test -n "$release" && \
	  func_warning "'-release' is ignored for convenience libraries"
      else

	# Parse the version information argument.
	save_ifs=$IFS; IFS=:
	set dummy $vinfo 0 0 0
	shift
	IFS=$save_ifs

	test -n "$7" && \
	  func_fatal_help "too many parameters to '-version-info'"

	# convert absolute version numbers to libtool ages
	# this retains compatibility with .la files and attempts
	# to make the code below a bit more comprehensible

	case $vinfo_number in
	yes)
	  number_major=$1
	  number_minor=$2
	  number_revision=$3
	  #
	  # There are really only two kinds -- those that
	  # use the current revision as the major version
	  # and those that subtract age and use age as
	  # a minor version.  But, then there is irix
	  # that has an extra 1 added just for fun
	  #
	  case $version_type in
	  # correct linux to gnu/linux during the next big refactor
	  darwin|freebsd-elf|linux|osf|windows|none)
	    func_arith $number_major + $number_minor
	    current=$func_arith_result
	    age=$number_minor
	    revision=$number_revision
	    ;;
	  freebsd-aout|qnx|sunos)
	    current=$number_major
	    revision=$number_minor
	    age=0
	    ;;
	  irix|nonstopux)
	    func_arith $number_major + $number_minor
	    current=$func_arith_result
	    age=$number_minor
	    revision=$number_minor
	    lt_irix_increment=no
	    ;;
	  esac
	  ;;
	no)
	  current=$1
	  revision=$2
	  age=$3
	  ;;
	esac

	# Check that each of the things are valid numbers.
	case $current in
	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
	*)
	  func_error "CURRENT '$current' must be a nonnegative integer"
	  func_fatal_error "'$vinfo' is not valid version information"
	  ;;
	esac

	case $revision in
	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
	*)
	  func_error "REVISION '$revision' must be a nonnegative integer"
	  func_fatal_error "'$vinfo' is not valid version information"
	  ;;
	esac

	case $age in
	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
	*)
	  func_error "AGE '$age' must be a nonnegative integer"
	  func_fatal_error "'$vinfo' is not valid version information"
	  ;;
	esac

	if test "$age" -gt "$current"; then
	  func_error "AGE '$age' is greater than the current interface number '$current'"
	  func_fatal_error "'$vinfo' is not valid version information"
	fi

	# Calculate the version variables.
	major=
	versuffix=
	verstring=
	case $version_type in
	none) ;;

	darwin)
	  # Like Linux, but with the current version available in
	  # verstring for coding it into the library header
	  func_arith $current - $age
	  major=.$func_arith_result
	  versuffix=$major.$age.$revision
	  # Darwin ld doesn't like 0 for these options...
	  func_arith $current + 1
	  minor_current=$func_arith_result
	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
          # On Darwin other compilers
          case $CC in
              nagfor*)
                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
                  ;;
              *)
                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
                  ;;
          esac
	  ;;

	freebsd-aout)
	  major=.$current
	  versuffix=.$current.$revision
	  ;;

	freebsd-elf)
	  func_arith $current - $age
	  major=.$func_arith_result
	  versuffix=$major.$age.$revision
	  ;;

	irix | nonstopux)
	  if test no = "$lt_irix_increment"; then
	    func_arith $current - $age
	  else
	    func_arith $current - $age + 1
	  fi
	  major=$func_arith_result

	  case $version_type in
	    nonstopux) verstring_prefix=nonstopux ;;
	    *)         verstring_prefix=sgi ;;
	  esac
	  verstring=$verstring_prefix$major.$revision

	  # Add in all the interfaces that we are compatible with.
	  loop=$revision
	  while test 0 -ne "$loop"; do
	    func_arith $revision - $loop
	    iface=$func_arith_result
	    func_arith $loop - 1
	    loop=$func_arith_result
	    verstring=$verstring_prefix$major.$iface:$verstring
	  done

	  # Before this point, $major must not contain '.'.
	  major=.$major
	  versuffix=$major.$revision
	  ;;

	linux) # correct to gnu/linux during the next big refactor
	  func_arith $current - $age
	  major=.$func_arith_result
	  versuffix=$major.$age.$revision
	  ;;

	osf)
	  func_arith $current - $age
	  major=.$func_arith_result
	  versuffix=.$current.$age.$revision
	  verstring=$current.$age.$revision

	  # Add in all the interfaces that we are compatible with.
	  loop=$age
	  while test 0 -ne "$loop"; do
	    func_arith $current - $loop
	    iface=$func_arith_result
	    func_arith $loop - 1
	    loop=$func_arith_result
	    verstring=$verstring:$iface.0
	  done

	  # Make executables depend on our current version.
	  func_append verstring ":$current.0"
	  ;;

	qnx)
	  major=.$current
	  versuffix=.$current
	  ;;

	sco)
	  major=.$current
	  versuffix=.$current
	  ;;

	sunos)
	  major=.$current
	  versuffix=.$current.$revision
	  ;;

	windows)
	  # Use '-' rather than '.', since we only want one
	  # extension on DOS 8.3 file systems.
	  func_arith $current - $age
	  major=$func_arith_result
	  versuffix=-$major
	  ;;

	*)
	  func_fatal_configuration "unknown library version type '$version_type'"
	  ;;
	esac

	# Clear the version info if we defaulted, and they specified a release.
	if test -z "$vinfo" && test -n "$release"; then
	  major=
	  case $version_type in
	  darwin)
	    # we can't check for "0.0" in archive_cmds due to quoting
	    # problems, so we reset it completely
	    verstring=
	    ;;
	  *)
	    verstring=0.0
	    ;;
	  esac
	  if test no = "$need_version"; then
	    versuffix=
	  else
	    versuffix=.0.0
	  fi
	fi

	# Remove version info from name if versioning should be avoided
	if test yes,no = "$avoid_version,$need_version"; then
	  major=
	  versuffix=
	  verstring=
	fi

	# Check to see if the archive will have undefined symbols.
	if test yes = "$allow_undefined"; then
	  if test unsupported = "$allow_undefined_flag"; then
	    if test yes = "$build_old_libs"; then
	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
	      build_libtool_libs=no
	    else
	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
	    fi
	  fi
	else
	  # Don't allow undefined symbols.
	  allow_undefined_flag=$no_undefined_flag
	fi

      fi

      func_generate_dlsyms "$libname" "$libname" :
      func_append libobjs " $symfileobj"
      test " " = "$libobjs" && libobjs=

      if test relink != "$opt_mode"; then
	# Remove our outputs, but don't remove object files since they
	# may have been created when compiling PIC objects.
	removelist=
	tempremovelist=`$ECHO "$output_objdir/*"`
	for p in $tempremovelist; do
	  case $p in
	    *.$objext | *.gcno)
	       ;;
	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
	       if test -n "$precious_files_regex"; then
		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
		 then
		   continue
		 fi
	       fi
	       func_append removelist " $p"
	       ;;
	    *) ;;
	  esac
	done
	test -n "$removelist" && \
	  func_show_eval "${RM}r \$removelist"
      fi

      # Now set the variables for building old libraries.
      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
	func_append oldlibs " $output_objdir/$libname.$libext"

	# Transform .lo files to .o files.
	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
      fi

      # Eliminate all temporary directories.
      #for path in $notinst_path; do
      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
      #done

      if test -n "$xrpath"; then
	# If the user specified any rpath flags, then add them.
	temp_xrpath=
	for libdir in $xrpath; do
	  func_replace_sysroot "$libdir"
	  func_append temp_xrpath " -R$func_replace_sysroot_result"
	  case "$finalize_rpath " in
	  *" $libdir "*) ;;
	  *) func_append finalize_rpath " $libdir" ;;
	  esac
	done
	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
	  dependency_libs="$temp_xrpath $dependency_libs"
	fi
      fi

      # Make sure dlfiles contains only unique files that won't be dlpreopened
      old_dlfiles=$dlfiles
      dlfiles=
      for lib in $old_dlfiles; do
	case " $dlprefiles $dlfiles " in
	*" $lib "*) ;;
	*) func_append dlfiles " $lib" ;;
	esac
      done

      # Make sure dlprefiles contains only unique files
      old_dlprefiles=$dlprefiles
      dlprefiles=
      for lib in $old_dlprefiles; do
	case "$dlprefiles " in
	*" $lib "*) ;;
	*) func_append dlprefiles " $lib" ;;
	esac
      done

      if test yes = "$build_libtool_libs"; then
	if test -n "$rpath"; then
	  case $host in
	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
	    # these systems don't actually have a c library (as such)!
	    ;;
	  *-*-rhapsody* | *-*-darwin1.[012])
	    # Rhapsody C library is in the System framework
	    func_append deplibs " System.ltframework"
	    ;;
	  *-*-netbsd*)
	    # Don't link with libc until the a.out ld.so is fixed.
	    ;;
	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
	    # Do not include libc due to us having libc/libc_r.
	    ;;
	  *-*-sco3.2v5* | *-*-sco5v6*)
	    # Causes problems with __ctype
	    ;;
	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
	    # Compiler inserts libc in the correct place for threads to work
	    ;;
	  *)
	    # Add libc to deplibs on all other systems if necessary.
	    if test yes = "$build_libtool_need_lc"; then
	      func_append deplibs " -lc"
	    fi
	    ;;
	  esac
	fi

	# Transform deplibs into only deplibs that can be linked in shared.
	name_save=$name
	libname_save=$libname
	release_save=$release
	versuffix_save=$versuffix
	major_save=$major
	# I'm not sure if I'm treating the release correctly.  I think
	# release should show up in the -l (ie -lgmp5) so we don't want to
	# add it in twice.  Is that correct?
	release=
	versuffix=
	major=
	newdeplibs=
	droppeddeps=no
	case $deplibs_check_method in
	pass_all)
	  # Don't check for shared/static.  Everything works.
	  # This might be a little naive.  We might want to check
	  # whether the library exists or not.  But this is on
	  # osf3 & osf4 and I'm not really sure... Just
	  # implementing what was already the behavior.
	  newdeplibs=$deplibs
	  ;;
	test_compile)
	  # This code stresses the "libraries are programs" paradigm to its
	  # limits. Maybe even breaks it.  We compile a program, linking it
	  # against the deplibs as a proxy for the library.  Then we can check
	  # whether they linked in statically or dynamically with ldd.
	  $opt_dry_run || $RM conftest.c
	  cat > conftest.c <<EOF
	  int main() { return 0; }
EOF
	  $opt_dry_run || $RM conftest
	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
	    ldd_output=`ldd conftest`
	    for i in $deplibs; do
	      case $i in
	      -l*)
		func_stripname -l '' "$i"
		name=$func_stripname_result
		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
		  case " $predeps $postdeps " in
		  *" $i "*)
		    func_append newdeplibs " $i"
		    i=
		    ;;
		  esac
		fi
		if test -n "$i"; then
		  libname=`eval "\\$ECHO \"$libname_spec\""`
		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
		  set dummy $deplib_matches; shift
		  deplib_match=$1
		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
		    func_append newdeplibs " $i"
		  else
		    droppeddeps=yes
		    echo
		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
		    echo "*** I have the capability to make that library automatically link in when"
		    echo "*** you link to this library.  But I can only do this if you have a"
		    echo "*** shared version of the library, which I believe you do not have"
		    echo "*** because a test_compile did reveal that the linker did not use it for"
		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
		  fi
		fi
		;;
	      *)
		func_append newdeplibs " $i"
		;;
	      esac
	    done
	  else
	    # Error occurred in the first compile.  Let's try to salvage
	    # the situation: Compile a separate program for each library.
	    for i in $deplibs; do
	      case $i in
	      -l*)
		func_stripname -l '' "$i"
		name=$func_stripname_result
		$opt_dry_run || $RM conftest
		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
		  ldd_output=`ldd conftest`
		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
		    case " $predeps $postdeps " in
		    *" $i "*)
		      func_append newdeplibs " $i"
		      i=
		      ;;
		    esac
		  fi
		  if test -n "$i"; then
		    libname=`eval "\\$ECHO \"$libname_spec\""`
		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
		    set dummy $deplib_matches; shift
		    deplib_match=$1
		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
		      func_append newdeplibs " $i"
		    else
		      droppeddeps=yes
		      echo
		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
		      echo "*** I have the capability to make that library automatically link in when"
		      echo "*** you link to this library.  But I can only do this if you have a"
		      echo "*** shared version of the library, which you do not appear to have"
		      echo "*** because a test_compile did reveal that the linker did not use this one"
		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
		    fi
		  fi
		else
		  droppeddeps=yes
		  echo
		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
		  echo "*** make it link in!  You will probably need to install it or some"
		  echo "*** library that it depends on before this library will be fully"
		  echo "*** functional.  Installing it before continuing would be even better."
		fi
		;;
	      *)
		func_append newdeplibs " $i"
		;;
	      esac
	    done
	  fi
	  ;;
	file_magic*)
	  set dummy $deplibs_check_method; shift
	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
	  for a_deplib in $deplibs; do
	    case $a_deplib in
	    -l*)
	      func_stripname -l '' "$a_deplib"
	      name=$func_stripname_result
	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
		case " $predeps $postdeps " in
		*" $a_deplib "*)
		  func_append newdeplibs " $a_deplib"
		  a_deplib=
		  ;;
		esac
	      fi
	      if test -n "$a_deplib"; then
		libname=`eval "\\$ECHO \"$libname_spec\""`
		if test -n "$file_magic_glob"; then
		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
		else
		  libnameglob=$libname
		fi
		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
		  if test yes = "$want_nocaseglob"; then
		    shopt -s nocaseglob
		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
		    $nocaseglob
		  else
		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
		  fi
		  for potent_lib in $potential_libs; do
		      # Follow soft links.
		      if ls -lLd "$potent_lib" 2>/dev/null |
			 $GREP " -> " >/dev/null; then
			continue
		      fi
		      # The statement above tries to avoid entering an
		      # endless loop below, in case of cyclic links.
		      # We might still enter an endless loop, since a link
		      # loop can be closed while we follow links,
		      # but so what?
		      potlib=$potent_lib
		      while test -h "$potlib" 2>/dev/null; do
			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
			case $potliblink in
			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
			esac
		      done
		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
			 $SED -e 10q |
			 $EGREP "$file_magic_regex" > /dev/null; then
			func_append newdeplibs " $a_deplib"
			a_deplib=
			break 2
		      fi
		  done
		done
	      fi
	      if test -n "$a_deplib"; then
		droppeddeps=yes
		echo
		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
		echo "*** I have the capability to make that library automatically link in when"
		echo "*** you link to this library.  But I can only do this if you have a"
		echo "*** shared version of the library, which you do not appear to have"
		echo "*** because I did check the linker path looking for a file starting"
		if test -z "$potlib"; then
		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
		else
		  $ECHO "*** with $libname and none of the candidates passed a file format test"
		  $ECHO "*** using a file magic. Last file checked: $potlib"
		fi
	      fi
	      ;;
	    *)
	      # Add a -L argument.
	      func_append newdeplibs " $a_deplib"
	      ;;
	    esac
	  done # Gone through all deplibs.
	  ;;
	match_pattern*)
	  set dummy $deplibs_check_method; shift
	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
	  for a_deplib in $deplibs; do
	    case $a_deplib in
	    -l*)
	      func_stripname -l '' "$a_deplib"
	      name=$func_stripname_result
	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
		case " $predeps $postdeps " in
		*" $a_deplib "*)
		  func_append newdeplibs " $a_deplib"
		  a_deplib=
		  ;;
		esac
	      fi
	      if test -n "$a_deplib"; then
		libname=`eval "\\$ECHO \"$libname_spec\""`
		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
		  for potent_lib in $potential_libs; do
		    potlib=$potent_lib # see symlink-check above in file_magic test
		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
		       $EGREP "$match_pattern_regex" > /dev/null; then
		      func_append newdeplibs " $a_deplib"
		      a_deplib=
		      break 2
		    fi
		  done
		done
	      fi
	      if test -n "$a_deplib"; then
		droppeddeps=yes
		echo
		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
		echo "*** I have the capability to make that library automatically link in when"
		echo "*** you link to this library.  But I can only do this if you have a"
		echo "*** shared version of the library, which you do not appear to have"
		echo "*** because I did check the linker path looking for a file starting"
		if test -z "$potlib"; then
		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
		else
		  $ECHO "*** with $libname and none of the candidates passed a file format test"
		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
		fi
	      fi
	      ;;
	    *)
	      # Add a -L argument.
	      func_append newdeplibs " $a_deplib"
	      ;;
	    esac
	  done # Gone through all deplibs.
	  ;;
	none | unknown | *)
	  newdeplibs=
	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
	    for i in $predeps $postdeps; do
	      # can't use Xsed below, because $i might contain '/'
	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
	    done
	  fi
	  case $tmp_deplibs in
	  *[!\	\ ]*)
	    echo
	    if test none = "$deplibs_check_method"; then
	      echo "*** Warning: inter-library dependencies are not supported in this platform."
	    else
	      echo "*** Warning: inter-library dependencies are not known to be supported."
	    fi
	    echo "*** All declared inter-library dependencies are being dropped."
	    droppeddeps=yes
	    ;;
	  esac
	  ;;
	esac
	versuffix=$versuffix_save
	major=$major_save
	release=$release_save
	libname=$libname_save
	name=$name_save

	case $host in
	*-*-rhapsody* | *-*-darwin1.[012])
	  # On Rhapsody replace the C library with the System framework
	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
	  ;;
	esac

	if test yes = "$droppeddeps"; then
	  if test yes = "$module"; then
	    echo
	    echo "*** Warning: libtool could not satisfy all declared inter-library"
	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
	    echo "*** a static module, that should work as long as the dlopening"
	    echo "*** application is linked with the -dlopen flag."
	    if test -z "$global_symbol_pipe"; then
	      echo
	      echo "*** However, this would only work if libtool was able to extract symbol"
	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
	      echo "*** not find such a program.  So, this module is probably useless."
	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
	    fi
	    if test no = "$build_old_libs"; then
	      oldlibs=$output_objdir/$libname.$libext
	      build_libtool_libs=module
	      build_old_libs=yes
	    else
	      build_libtool_libs=no
	    fi
	  else
	    echo "*** The inter-library dependencies that have been dropped here will be"
	    echo "*** automatically added whenever a program is linked with this library"
	    echo "*** or is declared to -dlopen it."

	    if test no = "$allow_undefined"; then
	      echo
	      echo "*** Since this library must not contain undefined symbols,"
	      echo "*** because either the platform does not support them or"
	      echo "*** it was explicitly requested with -no-undefined,"
	      echo "*** libtool will only create a static version of it."
	      if test no = "$build_old_libs"; then
		oldlibs=$output_objdir/$libname.$libext
		build_libtool_libs=module
		build_old_libs=yes
	      else
		build_libtool_libs=no
	      fi
	    fi
	  fi
	fi
	# Done checking deplibs!
	deplibs=$newdeplibs
      fi
      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
      case $host in
	*-*-darwin*)
	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
	  ;;
      esac

      # move library search paths that coincide with paths to not yet
      # installed libraries to the beginning of the library search list
      new_libs=
      for path in $notinst_path; do
	case " $new_libs " in
	*" -L$path/$objdir "*) ;;
	*)
	  case " $deplibs " in
	  *" -L$path/$objdir "*)
	    func_append new_libs " -L$path/$objdir" ;;
	  esac
	  ;;
	esac
      done
      for deplib in $deplibs; do
	case $deplib in
	-L*)
	  case " $new_libs " in
	  *" $deplib "*) ;;
	  *) func_append new_libs " $deplib" ;;
	  esac
	  ;;
	*) func_append new_libs " $deplib" ;;
	esac
      done
      deplibs=$new_libs

      # All the library-specific variables (install_libdir is set above).
      library_names=
      old_library=
      dlname=

      # Test again, we may have decided not to build it any more
      if test yes = "$build_libtool_libs"; then
	# Remove $wl instances when linking with ld.
	# FIXME: should test the right _cmds variable.
	case $archive_cmds in
	  *\$LD\ *) wl= ;;
        esac
	if test yes = "$hardcode_into_libs"; then
	  # Hardcode the library paths
	  hardcode_libdirs=
	  dep_rpath=
	  rpath=$finalize_rpath
	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
	  for libdir in $rpath; do
	    if test -n "$hardcode_libdir_flag_spec"; then
	      if test -n "$hardcode_libdir_separator"; then
		func_replace_sysroot "$libdir"
		libdir=$func_replace_sysroot_result
		if test -z "$hardcode_libdirs"; then
		  hardcode_libdirs=$libdir
		else
		  # Just accumulate the unique libdirs.
		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
		    ;;
		  *)
		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
		    ;;
		  esac
		fi
	      else
		eval flag=\"$hardcode_libdir_flag_spec\"
		func_append dep_rpath " $flag"
	      fi
	    elif test -n "$runpath_var"; then
	      case "$perm_rpath " in
	      *" $libdir "*) ;;
	      *) func_append perm_rpath " $libdir" ;;
	      esac
	    fi
	  done
	  # Substitute the hardcoded libdirs into the rpath.
	  if test -n "$hardcode_libdir_separator" &&
	     test -n "$hardcode_libdirs"; then
	    libdir=$hardcode_libdirs
	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
	  fi
	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
	    # We should set the runpath_var.
	    rpath=
	    for dir in $perm_rpath; do
	      func_append rpath "$dir:"
	    done
	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
	  fi
	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
	fi

	shlibpath=$finalize_shlibpath
	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
	if test -n "$shlibpath"; then
	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
	fi

	# Get the real and link names of the library.
	eval shared_ext=\"$shrext_cmds\"
	eval library_names=\"$library_names_spec\"
	set dummy $library_names
	shift
	realname=$1
	shift

	if test -n "$soname_spec"; then
	  eval soname=\"$soname_spec\"
	else
	  soname=$realname
	fi
	if test -z "$dlname"; then
	  dlname=$soname
	fi

	lib=$output_objdir/$realname
	linknames=
	for link
	do
	  func_append linknames " $link"
	done

	# Use standard objects if they are pic
	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
	test "X$libobjs" = "X " && libobjs=

	delfiles=
	if test -n "$export_symbols" && test -n "$include_expsyms"; then
	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
	  export_symbols=$output_objdir/$libname.uexp
	  func_append delfiles " $export_symbols"
	fi

	orig_export_symbols=
	case $host_os in
	cygwin* | mingw* | cegcc*)
	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
	    # exporting using user supplied symfile
	    func_dll_def_p "$export_symbols" || {
	      # and it's NOT already a .def file. Must figure out
	      # which of the given symbols are data symbols and tag
	      # them as such. So, trigger use of export_symbols_cmds.
	      # export_symbols gets reassigned inside the "prepare
	      # the list of exported symbols" if statement, so the
	      # include_expsyms logic still works.
	      orig_export_symbols=$export_symbols
	      export_symbols=
	      always_export_symbols=yes
	    }
	  fi
	  ;;
	esac

	# Prepare the list of exported symbols
	if test -z "$export_symbols"; then
	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
	    func_verbose "generating symbol list for '$libname.la'"
	    export_symbols=$output_objdir/$libname.exp
	    $opt_dry_run || $RM $export_symbols
	    cmds=$export_symbols_cmds
	    save_ifs=$IFS; IFS='~'
	    for cmd1 in $cmds; do
	      IFS=$save_ifs
	      # Take the normal branch if the nm_file_list_spec branch
	      # doesn't work or if tool conversion is not needed.
	      case $nm_file_list_spec~$to_tool_file_cmd in
		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
		  try_normal_branch=yes
		  eval cmd=\"$cmd1\"
		  func_len " $cmd"
		  len=$func_len_result
		  ;;
		*)
		  try_normal_branch=no
		  ;;
	      esac
	      if test yes = "$try_normal_branch" \
		 && { test "$len" -lt "$max_cmd_len" \
		      || test "$max_cmd_len" -le -1; }
	      then
		func_show_eval "$cmd" 'exit $?'
		skipped_export=false
	      elif test -n "$nm_file_list_spec"; then
		func_basename "$output"
		output_la=$func_basename_result
		save_libobjs=$libobjs
		save_output=$output
		output=$output_objdir/$output_la.nm
		func_to_tool_file "$output"
		libobjs=$nm_file_list_spec$func_to_tool_file_result
		func_append delfiles " $output"
		func_verbose "creating $NM input file list: $output"
		for obj in $save_libobjs; do
		  func_to_tool_file "$obj"
		  $ECHO "$func_to_tool_file_result"
		done > "$output"
		eval cmd=\"$cmd1\"
		func_show_eval "$cmd" 'exit $?'
		output=$save_output
		libobjs=$save_libobjs
		skipped_export=false
	      else
		# The command line is too long to execute in one step.
		func_verbose "using reloadable object file for export list..."
		skipped_export=:
		# Break out early, otherwise skipped_export may be
		# set to false by a later but shorter cmd.
		break
	      fi
	    done
	    IFS=$save_ifs
	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
	    fi
	  fi
	fi

	if test -n "$export_symbols" && test -n "$include_expsyms"; then
	  tmp_export_symbols=$export_symbols
	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
	fi

	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
	  # The given exports_symbols file has to be filtered, so filter it.
	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
	  # 's' commands, which not all seds can handle. GNU sed should be fine
	  # though. Also, the filter scales superlinearly with the number of
	  # global variables. join(1) would be nice here, but unfortunately
	  # isn't a blessed tool.
	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
	  export_symbols=$output_objdir/$libname.def
	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
	fi

	tmp_deplibs=
	for test_deplib in $deplibs; do
	  case " $convenience " in
	  *" $test_deplib "*) ;;
	  *)
	    func_append tmp_deplibs " $test_deplib"
	    ;;
	  esac
	done
	deplibs=$tmp_deplibs

	if test -n "$convenience"; then
	  if test -n "$whole_archive_flag_spec" &&
	    test yes = "$compiler_needs_object" &&
	    test -z "$libobjs"; then
	    # extract the archives, so we have objects to list.
	    # TODO: could optimize this to just extract one archive.
	    whole_archive_flag_spec=
	  fi
	  if test -n "$whole_archive_flag_spec"; then
	    save_libobjs=$libobjs
	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
	    test "X$libobjs" = "X " && libobjs=
	  else
	    gentop=$output_objdir/${outputname}x
	    func_append generated " $gentop"

	    func_extract_archives $gentop $convenience
	    func_append libobjs " $func_extract_archives_result"
	    test "X$libobjs" = "X " && libobjs=
	  fi
	fi

	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
	  eval flag=\"$thread_safe_flag_spec\"
	  func_append linker_flags " $flag"
	fi

	# Make a backup of the uninstalled library when relinking
	if test relink = "$opt_mode"; then
	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
	fi

	# Do each of the archive commands.
	if test yes = "$module" && test -n "$module_cmds"; then
	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
	    eval test_cmds=\"$module_expsym_cmds\"
	    cmds=$module_expsym_cmds
	  else
	    eval test_cmds=\"$module_cmds\"
	    cmds=$module_cmds
	  fi
	else
	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
	    eval test_cmds=\"$archive_expsym_cmds\"
	    cmds=$archive_expsym_cmds
	  else
	    eval test_cmds=\"$archive_cmds\"
	    cmds=$archive_cmds
	  fi
	fi

	if test : != "$skipped_export" &&
	   func_len " $test_cmds" &&
	   len=$func_len_result &&
	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
	  :
	else
	  # The command line is too long to link in one step, link piecewise
	  # or, if using GNU ld and skipped_export is not :, use a linker
	  # script.

	  # Save the value of $output and $libobjs because we want to
	  # use them later.  If we have whole_archive_flag_spec, we
	  # want to use save_libobjs as it was before
	  # whole_archive_flag_spec was expanded, because we can't
	  # assume the linker understands whole_archive_flag_spec.
	  # This may have to be revisited, in case too many
	  # convenience libraries get linked in and end up exceeding
	  # the spec.
	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
	    save_libobjs=$libobjs
	  fi
	  save_output=$output
	  func_basename "$output"
	  output_la=$func_basename_result

	  # Clear the reloadable object creation command queue and
	  # initialize k to one.
	  test_cmds=
	  concat_cmds=
	  objlist=
	  last_robj=
	  k=1

	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
	    output=$output_objdir/$output_la.lnkscript
	    func_verbose "creating GNU ld script: $output"
	    echo 'INPUT (' > $output
	    for obj in $save_libobjs
	    do
	      func_to_tool_file "$obj"
	      $ECHO "$func_to_tool_file_result" >> $output
	    done
	    echo ')' >> $output
	    func_append delfiles " $output"
	    func_to_tool_file "$output"
	    output=$func_to_tool_file_result
	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
	    output=$output_objdir/$output_la.lnk
	    func_verbose "creating linker input file list: $output"
	    : > $output
	    set x $save_libobjs
	    shift
	    firstobj=
	    if test yes = "$compiler_needs_object"; then
	      firstobj="$1 "
	      shift
	    fi
	    for obj
	    do
	      func_to_tool_file "$obj"
	      $ECHO "$func_to_tool_file_result" >> $output
	    done
	    func_append delfiles " $output"
	    func_to_tool_file "$output"
	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
	  else
	    if test -n "$save_libobjs"; then
	      func_verbose "creating reloadable object files..."
	      output=$output_objdir/$output_la-$k.$objext
	      eval test_cmds=\"$reload_cmds\"
	      func_len " $test_cmds"
	      len0=$func_len_result
	      len=$len0

	      # Loop over the list of objects to be linked.
	      for obj in $save_libobjs
	      do
		func_len " $obj"
		func_arith $len + $func_len_result
		len=$func_arith_result
		if test -z "$objlist" ||
		   test "$len" -lt "$max_cmd_len"; then
		  func_append objlist " $obj"
		else
		  # The command $test_cmds is almost too long, add a
		  # command to the queue.
		  if test 1 -eq "$k"; then
		    # The first file doesn't have a previous command to add.
		    reload_objs=$objlist
		    eval concat_cmds=\"$reload_cmds\"
		  else
		    # All subsequent reloadable object files will link in
		    # the last one created.
		    reload_objs="$objlist $last_robj"
		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
		  fi
		  last_robj=$output_objdir/$output_la-$k.$objext
		  func_arith $k + 1
		  k=$func_arith_result
		  output=$output_objdir/$output_la-$k.$objext
		  objlist=" $obj"
		  func_len " $last_robj"
		  func_arith $len0 + $func_len_result
		  len=$func_arith_result
		fi
	      done
	      # Handle the remaining objects by creating one last
	      # reloadable object file.  All subsequent reloadable object
	      # files will link in the last one created.
	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
	      reload_objs="$objlist $last_robj"
	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
	      if test -n "$last_robj"; then
	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
	      fi
	      func_append delfiles " $output"

	    else
	      output=
	    fi

	    ${skipped_export-false} && {
	      func_verbose "generating symbol list for '$libname.la'"
	      export_symbols=$output_objdir/$libname.exp
	      $opt_dry_run || $RM $export_symbols
	      libobjs=$output
	      # Append the command to create the export file.
	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
	      if test -n "$last_robj"; then
		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
	      fi
	    }

	    test -n "$save_libobjs" &&
	      func_verbose "creating a temporary reloadable object file: $output"

	    # Loop through the commands generated above and execute them.
	    save_ifs=$IFS; IFS='~'
	    for cmd in $concat_cmds; do
	      IFS=$save_ifs
	      $opt_quiet || {
		  func_quote_for_expand "$cmd"
		  eval "func_echo $func_quote_for_expand_result"
	      }
	      $opt_dry_run || eval "$cmd" || {
		lt_exit=$?

		# Restore the uninstalled library and exit
		if test relink = "$opt_mode"; then
		  ( cd "$output_objdir" && \
		    $RM "${realname}T" && \
		    $MV "${realname}U" "$realname" )
		fi

		exit $lt_exit
	      }
	    done
	    IFS=$save_ifs

	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
	    fi
	  fi

          ${skipped_export-false} && {
	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
	      tmp_export_symbols=$export_symbols
	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
	    fi

	    if test -n "$orig_export_symbols"; then
	      # The given exports_symbols file has to be filtered, so filter it.
	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
	      # 's' commands, which not all seds can handle. GNU sed should be fine
	      # though. Also, the filter scales superlinearly with the number of
	      # global variables. join(1) would be nice here, but unfortunately
	      # isn't a blessed tool.
	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
	      export_symbols=$output_objdir/$libname.def
	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
	    fi
	  }

	  libobjs=$output
	  # Restore the value of output.
	  output=$save_output

	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
	    test "X$libobjs" = "X " && libobjs=
	  fi
	  # Expand the library linking commands again to reset the
	  # value of $libobjs for piecewise linking.

	  # Do each of the archive commands.
	  if test yes = "$module" && test -n "$module_cmds"; then
	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
	      cmds=$module_expsym_cmds
	    else
	      cmds=$module_cmds
	    fi
	  else
	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
	      cmds=$archive_expsym_cmds
	    else
	      cmds=$archive_cmds
	    fi
	  fi
	fi

	if test -n "$delfiles"; then
	  # Append the command to remove temporary files to $cmds.
	  eval cmds=\"\$cmds~\$RM $delfiles\"
	fi

	# Add any objects from preloaded convenience libraries
	if test -n "$dlprefiles"; then
	  gentop=$output_objdir/${outputname}x
	  func_append generated " $gentop"

	  func_extract_archives $gentop $dlprefiles
	  func_append libobjs " $func_extract_archives_result"
	  test "X$libobjs" = "X " && libobjs=
	fi

	save_ifs=$IFS; IFS='~'
	for cmd in $cmds; do
	  IFS=$sp$nl
	  eval cmd=\"$cmd\"
	  IFS=$save_ifs
	  $opt_quiet || {
	    func_quote_for_expand "$cmd"
	    eval "func_echo $func_quote_for_expand_result"
	  }
	  $opt_dry_run || eval "$cmd" || {
	    lt_exit=$?

	    # Restore the uninstalled library and exit
	    if test relink = "$opt_mode"; then
	      ( cd "$output_objdir" && \
	        $RM "${realname}T" && \
		$MV "${realname}U" "$realname" )
	    fi

	    exit $lt_exit
	  }
	done
	IFS=$save_ifs

	# Restore the uninstalled library and exit
	if test relink = "$opt_mode"; then
	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?

	  if test -n "$convenience"; then
	    if test -z "$whole_archive_flag_spec"; then
	      func_show_eval '${RM}r "$gentop"'
	    fi
	  fi

	  exit $EXIT_SUCCESS
	fi

	# Create links to the real library.
	for linkname in $linknames; do
	  if test "$realname" != "$linkname"; then
	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
	  fi
	done

	# If -module or -export-dynamic was specified, set the dlname.
	if test yes = "$module" || test yes = "$export_dynamic"; then
	  # On all known operating systems, these are identical.
	  dlname=$soname
	fi
      fi
      ;;

    obj)
      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
	func_warning "'-dlopen' is ignored for objects"
      fi

      case " $deplibs" in
      *\ -l* | *\ -L*)
	func_warning "'-l' and '-L' are ignored for objects" ;;
      esac

      test -n "$rpath" && \
	func_warning "'-rpath' is ignored for objects"

      test -n "$xrpath" && \
	func_warning "'-R' is ignored for objects"

      test -n "$vinfo" && \
	func_warning "'-version-info' is ignored for objects"

      test -n "$release" && \
	func_warning "'-release' is ignored for objects"

      case $output in
      *.lo)
	test -n "$objs$old_deplibs" && \
	  func_fatal_error "cannot build library object '$output' from non-libtool objects"

	libobj=$output
	func_lo2o "$libobj"
	obj=$func_lo2o_result
	;;
      *)
	libobj=
	obj=$output
	;;
      esac

      # Delete the old objects.
      $opt_dry_run || $RM $obj $libobj

      # Objects from convenience libraries.  This assumes
      # single-version convenience libraries.  Whenever we create
      # different ones for PIC/non-PIC, this we'll have to duplicate
      # the extraction.
      reload_conv_objs=
      gentop=
      # if reload_cmds runs $LD directly, get rid of -Wl from
      # whole_archive_flag_spec and hope we can get by with turning comma
      # into space.
      case $reload_cmds in
        *\$LD[\ \$]*) wl= ;;
      esac
      if test -n "$convenience"; then
	if test -n "$whole_archive_flag_spec"; then
	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
	else
	  gentop=$output_objdir/${obj}x
	  func_append generated " $gentop"

	  func_extract_archives $gentop $convenience
	  reload_conv_objs="$reload_objs $func_extract_archives_result"
	fi
      fi

      # If we're not building shared, we need to use non_pic_objs
      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects

      # Create the old-style object.
      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs

      output=$obj
      func_execute_cmds "$reload_cmds" 'exit $?'

      # Exit if we aren't doing a library object file.
      if test -z "$libobj"; then
	if test -n "$gentop"; then
	  func_show_eval '${RM}r "$gentop"'
	fi

	exit $EXIT_SUCCESS
      fi

      test yes = "$build_libtool_libs" || {
	if test -n "$gentop"; then
	  func_show_eval '${RM}r "$gentop"'
	fi

	# Create an invalid libtool object if no PIC, so that we don't
	# accidentally link it into a program.
	# $show "echo timestamp > $libobj"
	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
	exit $EXIT_SUCCESS
      }

      if test -n "$pic_flag" || test default != "$pic_mode"; then
	# Only do commands if we really have different PIC objects.
	reload_objs="$libobjs $reload_conv_objs"
	output=$libobj
	func_execute_cmds "$reload_cmds" 'exit $?'
      fi

      if test -n "$gentop"; then
	func_show_eval '${RM}r "$gentop"'
      fi

      exit $EXIT_SUCCESS
      ;;

    prog)
      case $host in
	*cygwin*) func_stripname '' '.exe' "$output"
	          output=$func_stripname_result.exe;;
      esac
      test -n "$vinfo" && \
	func_warning "'-version-info' is ignored for programs"

      test -n "$release" && \
	func_warning "'-release' is ignored for programs"

      $preload \
	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."

      case $host in
      *-*-rhapsody* | *-*-darwin1.[012])
	# On Rhapsody replace the C library is the System framework
	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
	;;
      esac

      case $host in
      *-*-darwin*)
	# Don't allow lazy linking, it breaks C++ global constructors
	# But is supposedly fixed on 10.4 or later (yay!).
	if test CXX = "$tagname"; then
	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
	    10.[0123])
	      func_append compile_command " $wl-bind_at_load"
	      func_append finalize_command " $wl-bind_at_load"
	    ;;
	  esac
	fi
	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
	;;
      esac


      # move library search paths that coincide with paths to not yet
      # installed libraries to the beginning of the library search list
      new_libs=
      for path in $notinst_path; do
	case " $new_libs " in
	*" -L$path/$objdir "*) ;;
	*)
	  case " $compile_deplibs " in
	  *" -L$path/$objdir "*)
	    func_append new_libs " -L$path/$objdir" ;;
	  esac
	  ;;
	esac
      done
      for deplib in $compile_deplibs; do
	case $deplib in
	-L*)
	  case " $new_libs " in
	  *" $deplib "*) ;;
	  *) func_append new_libs " $deplib" ;;
	  esac
	  ;;
	*) func_append new_libs " $deplib" ;;
	esac
      done
      compile_deplibs=$new_libs


      func_append compile_command " $compile_deplibs"
      func_append finalize_command " $finalize_deplibs"

      if test -n "$rpath$xrpath"; then
	# If the user specified any rpath flags, then add them.
	for libdir in $rpath $xrpath; do
	  # This is the magic to use -rpath.
	  case "$finalize_rpath " in
	  *" $libdir "*) ;;
	  *) func_append finalize_rpath " $libdir" ;;
	  esac
	done
      fi

      # Now hardcode the library paths
      rpath=
      hardcode_libdirs=
      for libdir in $compile_rpath $finalize_rpath; do
	if test -n "$hardcode_libdir_flag_spec"; then
	  if test -n "$hardcode_libdir_separator"; then
	    if test -z "$hardcode_libdirs"; then
	      hardcode_libdirs=$libdir
	    else
	      # Just accumulate the unique libdirs.
	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
		;;
	      *)
		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
		;;
	      esac
	    fi
	  else
	    eval flag=\"$hardcode_libdir_flag_spec\"
	    func_append rpath " $flag"
	  fi
	elif test -n "$runpath_var"; then
	  case "$perm_rpath " in
	  *" $libdir "*) ;;
	  *) func_append perm_rpath " $libdir" ;;
	  esac
	fi
	case $host in
	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
	  case :$dllsearchpath: in
	  *":$libdir:"*) ;;
	  ::) dllsearchpath=$libdir;;
	  *) func_append dllsearchpath ":$libdir";;
	  esac
	  case :$dllsearchpath: in
	  *":$testbindir:"*) ;;
	  ::) dllsearchpath=$testbindir;;
	  *) func_append dllsearchpath ":$testbindir";;
	  esac
	  ;;
	esac
      done
      # Substitute the hardcoded libdirs into the rpath.
      if test -n "$hardcode_libdir_separator" &&
	 test -n "$hardcode_libdirs"; then
	libdir=$hardcode_libdirs
	eval rpath=\" $hardcode_libdir_flag_spec\"
      fi
      compile_rpath=$rpath

      rpath=
      hardcode_libdirs=
      for libdir in $finalize_rpath; do
	if test -n "$hardcode_libdir_flag_spec"; then
	  if test -n "$hardcode_libdir_separator"; then
	    if test -z "$hardcode_libdirs"; then
	      hardcode_libdirs=$libdir
	    else
	      # Just accumulate the unique libdirs.
	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
		;;
	      *)
		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
		;;
	      esac
	    fi
	  else
	    eval flag=\"$hardcode_libdir_flag_spec\"
	    func_append rpath " $flag"
	  fi
	elif test -n "$runpath_var"; then
	  case "$finalize_perm_rpath " in
	  *" $libdir "*) ;;
	  *) func_append finalize_perm_rpath " $libdir" ;;
	  esac
	fi
      done
      # Substitute the hardcoded libdirs into the rpath.
      if test -n "$hardcode_libdir_separator" &&
	 test -n "$hardcode_libdirs"; then
	libdir=$hardcode_libdirs
	eval rpath=\" $hardcode_libdir_flag_spec\"
      fi
      finalize_rpath=$rpath

      if test -n "$libobjs" && test yes = "$build_old_libs"; then
	# Transform all the library objects into standard objects.
	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
      fi

      func_generate_dlsyms "$outputname" "@PROGRAM@" false

      # template prelinking step
      if test -n "$prelink_cmds"; then
	func_execute_cmds "$prelink_cmds" 'exit $?'
      fi

      wrappers_required=:
      case $host in
      *cegcc* | *mingw32ce*)
        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
        wrappers_required=false
        ;;
      *cygwin* | *mingw* )
        test yes = "$build_libtool_libs" || wrappers_required=false
        ;;
      *)
        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
          wrappers_required=false
        fi
        ;;
      esac
      $wrappers_required || {
	# Replace the output file specification.
	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
	link_command=$compile_command$compile_rpath

	# We have no uninstalled library dependencies, so finalize right now.
	exit_status=0
	func_show_eval "$link_command" 'exit_status=$?'

	if test -n "$postlink_cmds"; then
	  func_to_tool_file "$output"
	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
	  func_execute_cmds "$postlink_cmds" 'exit $?'
	fi

	# Delete the generated files.
	if test -f "$output_objdir/${outputname}S.$objext"; then
	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
	fi

	exit $exit_status
      }

      if test -n "$compile_shlibpath$finalize_shlibpath"; then
	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
      fi
      if test -n "$finalize_shlibpath"; then
	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
      fi

      compile_var=
      finalize_var=
      if test -n "$runpath_var"; then
	if test -n "$perm_rpath"; then
	  # We should set the runpath_var.
	  rpath=
	  for dir in $perm_rpath; do
	    func_append rpath "$dir:"
	  done
	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
	fi
	if test -n "$finalize_perm_rpath"; then
	  # We should set the runpath_var.
	  rpath=
	  for dir in $finalize_perm_rpath; do
	    func_append rpath "$dir:"
	  done
	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
	fi
      fi

      if test yes = "$no_install"; then
	# We don't need to create a wrapper script.
	link_command=$compile_var$compile_command$compile_rpath
	# Replace the output file specification.
	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
	# Delete the old output file.
	$opt_dry_run || $RM $output
	# Link the executable and exit
	func_show_eval "$link_command" 'exit $?'

	if test -n "$postlink_cmds"; then
	  func_to_tool_file "$output"
	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
	  func_execute_cmds "$postlink_cmds" 'exit $?'
	fi

	exit $EXIT_SUCCESS
      fi

      case $hardcode_action,$fast_install in
        relink,*)
	  # Fast installation is not supported
	  link_command=$compile_var$compile_command$compile_rpath
	  relink_command=$finalize_var$finalize_command$finalize_rpath

	  func_warning "this platform does not like uninstalled shared libraries"
	  func_warning "'$output' will be relinked during installation"
	  ;;
        *,yes)
	  link_command=$finalize_var$compile_command$finalize_rpath
	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
          ;;
	*,no)
	  link_command=$compile_var$compile_command$compile_rpath
	  relink_command=$finalize_var$finalize_command$finalize_rpath
          ;;
	*,needless)
	  link_command=$finalize_var$compile_command$finalize_rpath
	  relink_command=
          ;;
      esac

      # Replace the output file specification.
      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`

      # Delete the old output files.
      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname

      func_show_eval "$link_command" 'exit $?'

      if test -n "$postlink_cmds"; then
	func_to_tool_file "$output_objdir/$outputname"
	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
	func_execute_cmds "$postlink_cmds" 'exit $?'
      fi

      # Now create the wrapper script.
      func_verbose "creating $output"

      # Quote the relink command for shipping.
      if test -n "$relink_command"; then
	# Preserve any variables that may affect compiler behavior
	for var in $variables_saved_for_relink; do
	  if eval test -z \"\${$var+set}\"; then
	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
	  elif eval var_value=\$$var; test -z "$var_value"; then
	    relink_command="$var=; export $var; $relink_command"
	  else
	    func_quote_for_eval "$var_value"
	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
	  fi
	done
	relink_command="(cd `pwd`; $relink_command)"
	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
      fi

      # Only actually do things if not in dry run mode.
      $opt_dry_run || {
	# win32 will think the script is a binary if it has
	# a .exe suffix, so we strip it off here.
	case $output in
	  *.exe) func_stripname '' '.exe' "$output"
	         output=$func_stripname_result ;;
	esac
	# test for cygwin because mv fails w/o .exe extensions
	case $host in
	  *cygwin*)
	    exeext=.exe
	    func_stripname '' '.exe' "$outputname"
	    outputname=$func_stripname_result ;;
	  *) exeext= ;;
	esac
	case $host in
	  *cygwin* | *mingw* )
	    func_dirname_and_basename "$output" "" "."
	    output_name=$func_basename_result
	    output_path=$func_dirname_result
	    cwrappersource=$output_path/$objdir/lt-$output_name.c
	    cwrapper=$output_path/$output_name.exe
	    $RM $cwrappersource $cwrapper
	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15

	    func_emit_cwrapperexe_src > $cwrappersource

	    # The wrapper executable is built using the $host compiler,
	    # because it contains $host paths and files. If cross-
	    # compiling, it, like the target executable, must be
	    # executed on the $host or under an emulation environment.
	    $opt_dry_run || {
	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
	      $STRIP $cwrapper
	    }

	    # Now, create the wrapper script for func_source use:
	    func_ltwrapper_scriptname $cwrapper
	    $RM $func_ltwrapper_scriptname_result
	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
	    $opt_dry_run || {
	      # note: this script will not be executed, so do not chmod.
	      if test "x$build" = "x$host"; then
		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
	      else
		func_emit_wrapper no > $func_ltwrapper_scriptname_result
	      fi
	    }
	  ;;
	  * )
	    $RM $output
	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15

	    func_emit_wrapper no > $output
	    chmod +x $output
	  ;;
	esac
      }
      exit $EXIT_SUCCESS
      ;;
    esac

    # See if we need to build an old-fashioned archive.
    for oldlib in $oldlibs; do

      case $build_libtool_libs in
        convenience)
	  oldobjs="$libobjs_save $symfileobj"
	  addlibs=$convenience
	  build_libtool_libs=no
	  ;;
	module)
	  oldobjs=$libobjs_save
	  addlibs=$old_convenience
	  build_libtool_libs=no
          ;;
	*)
	  oldobjs="$old_deplibs $non_pic_objects"
	  $preload && test -f "$symfileobj" \
	    && func_append oldobjs " $symfileobj"
	  addlibs=$old_convenience
	  ;;
      esac

      if test -n "$addlibs"; then
	gentop=$output_objdir/${outputname}x
	func_append generated " $gentop"

	func_extract_archives $gentop $addlibs
	func_append oldobjs " $func_extract_archives_result"
      fi

      # Do each command in the archive commands.
      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
	cmds=$old_archive_from_new_cmds
      else

	# Add any objects from preloaded convenience libraries
	if test -n "$dlprefiles"; then
	  gentop=$output_objdir/${outputname}x
	  func_append generated " $gentop"

	  func_extract_archives $gentop $dlprefiles
	  func_append oldobjs " $func_extract_archives_result"
	fi

	# POSIX demands no paths to be encoded in archives.  We have
	# to avoid creating archives with duplicate basenames if we
	# might have to extract them afterwards, e.g., when creating a
	# static archive out of a convenience library, or when linking
	# the entirety of a libtool archive into another (currently
	# not supported by libtool).
	if (for obj in $oldobjs
	    do
	      func_basename "$obj"
	      $ECHO "$func_basename_result"
	    done | sort | sort -uc >/dev/null 2>&1); then
	  :
	else
	  echo "copying selected object files to avoid basename conflicts..."
	  gentop=$output_objdir/${outputname}x
	  func_append generated " $gentop"
	  func_mkdir_p "$gentop"
	  save_oldobjs=$oldobjs
	  oldobjs=
	  counter=1
	  for obj in $save_oldobjs
	  do
	    func_basename "$obj"
	    objbase=$func_basename_result
	    case " $oldobjs " in
	    " ") oldobjs=$obj ;;
	    *[\ /]"$objbase "*)
	      while :; do
		# Make sure we don't pick an alternate name that also
		# overlaps.
		newobj=lt$counter-$objbase
		func_arith $counter + 1
		counter=$func_arith_result
		case " $oldobjs " in
		*[\ /]"$newobj "*) ;;
		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
		esac
	      done
	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
	      func_append oldobjs " $gentop/$newobj"
	      ;;
	    *) func_append oldobjs " $obj" ;;
	    esac
	  done
	fi
	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
	tool_oldlib=$func_to_tool_file_result
	eval cmds=\"$old_archive_cmds\"

	func_len " $cmds"
	len=$func_len_result
	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
	  cmds=$old_archive_cmds
	elif test -n "$archiver_list_spec"; then
	  func_verbose "using command file archive linking..."
	  for obj in $oldobjs
	  do
	    func_to_tool_file "$obj"
	    $ECHO "$func_to_tool_file_result"
	  done > $output_objdir/$libname.libcmd
	  func_to_tool_file "$output_objdir/$libname.libcmd"
	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
	  cmds=$old_archive_cmds
	else
	  # the command line is too long to link in one step, link in parts
	  func_verbose "using piecewise archive linking..."
	  save_RANLIB=$RANLIB
	  RANLIB=:
	  objlist=
	  concat_cmds=
	  save_oldobjs=$oldobjs
	  oldobjs=
	  # Is there a better way of finding the last object in the list?
	  for obj in $save_oldobjs
	  do
	    last_oldobj=$obj
	  done
	  eval test_cmds=\"$old_archive_cmds\"
	  func_len " $test_cmds"
	  len0=$func_len_result
	  len=$len0
	  for obj in $save_oldobjs
	  do
	    func_len " $obj"
	    func_arith $len + $func_len_result
	    len=$func_arith_result
	    func_append objlist " $obj"
	    if test "$len" -lt "$max_cmd_len"; then
	      :
	    else
	      # the above command should be used before it gets too long
	      oldobjs=$objlist
	      if test "$obj" = "$last_oldobj"; then
		RANLIB=$save_RANLIB
	      fi
	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
	      objlist=
	      len=$len0
	    fi
	  done
	  RANLIB=$save_RANLIB
	  oldobjs=$objlist
	  if test -z "$oldobjs"; then
	    eval cmds=\"\$concat_cmds\"
	  else
	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
	  fi
	fi
      fi
      func_execute_cmds "$cmds" 'exit $?'
    done

    test -n "$generated" && \
      func_show_eval "${RM}r$generated"

    # Now create the libtool archive.
    case $output in
    *.la)
      old_library=
      test yes = "$build_old_libs" && old_library=$libname.$libext
      func_verbose "creating $output"

      # Preserve any variables that may affect compiler behavior
      for var in $variables_saved_for_relink; do
	if eval test -z \"\${$var+set}\"; then
	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
	elif eval var_value=\$$var; test -z "$var_value"; then
	  relink_command="$var=; export $var; $relink_command"
	else
	  func_quote_for_eval "$var_value"
	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
	fi
      done
      # Quote the link command for shipping.
      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
      if test yes = "$hardcode_automatic"; then
	relink_command=
      fi

      # Only create the output if not a dry run.
      $opt_dry_run || {
	for installed in no yes; do
	  if test yes = "$installed"; then
	    if test -z "$install_libdir"; then
	      break
	    fi
	    output=$output_objdir/${outputname}i
	    # Replace all uninstalled libtool libraries with the installed ones
	    newdependency_libs=
	    for deplib in $dependency_libs; do
	      case $deplib in
	      *.la)
		func_basename "$deplib"
		name=$func_basename_result
		func_resolve_sysroot "$deplib"
		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
		test -z "$libdir" && \
		  func_fatal_error "'$deplib' is not a valid libtool archive"
		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
		;;
	      -L*)
		func_stripname -L '' "$deplib"
		func_replace_sysroot "$func_stripname_result"
		func_append newdependency_libs " -L$func_replace_sysroot_result"
		;;
	      -R*)
		func_stripname -R '' "$deplib"
		func_replace_sysroot "$func_stripname_result"
		func_append newdependency_libs " -R$func_replace_sysroot_result"
		;;
	      *) func_append newdependency_libs " $deplib" ;;
	      esac
	    done
	    dependency_libs=$newdependency_libs
	    newdlfiles=

	    for lib in $dlfiles; do
	      case $lib in
	      *.la)
	        func_basename "$lib"
		name=$func_basename_result
		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
		test -z "$libdir" && \
		  func_fatal_error "'$lib' is not a valid libtool archive"
		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
		;;
	      *) func_append newdlfiles " $lib" ;;
	      esac
	    done
	    dlfiles=$newdlfiles
	    newdlprefiles=
	    for lib in $dlprefiles; do
	      case $lib in
	      *.la)
		# Only pass preopened files to the pseudo-archive (for
		# eventual linking with the app. that links it) if we
		# didn't already link the preopened objects directly into
		# the library:
		func_basename "$lib"
		name=$func_basename_result
		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
		test -z "$libdir" && \
		  func_fatal_error "'$lib' is not a valid libtool archive"
		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
		;;
	      esac
	    done
	    dlprefiles=$newdlprefiles
	  else
	    newdlfiles=
	    for lib in $dlfiles; do
	      case $lib in
		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
		*) abs=`pwd`"/$lib" ;;
	      esac
	      func_append newdlfiles " $abs"
	    done
	    dlfiles=$newdlfiles
	    newdlprefiles=
	    for lib in $dlprefiles; do
	      case $lib in
		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
		*) abs=`pwd`"/$lib" ;;
	      esac
	      func_append newdlprefiles " $abs"
	    done
	    dlprefiles=$newdlprefiles
	  fi
	  $RM $output
	  # place dlname in correct position for cygwin
	  # In fact, it would be nice if we could use this code for all target
	  # systems that can't hard-code library paths into their executables
	  # and that have no shared library path variable independent of PATH,
	  # but it turns out we can't easily determine that from inspecting
	  # libtool variables, so we have to hard-code the OSs to which it
	  # applies here; at the moment, that means platforms that use the PE
	  # object format with DLL files.  See the long comment at the top of
	  # tests/bindir.at for full details.
	  tdlname=$dlname
	  case $host,$output,$installed,$module,$dlname in
	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
	      # If a -bindir argument was supplied, place the dll there.
	      if test -n "$bindir"; then
		func_relative_path "$install_libdir" "$bindir"
		tdlname=$func_relative_path_result/$dlname
	      else
		# Otherwise fall back on heuristic.
		tdlname=../bin/$dlname
	      fi
	      ;;
	  esac
	  $ECHO > $output "\
# $outputname - a libtool library file
# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='$tdlname'

# Names of this library.
library_names='$library_names'

# The name of the static archive.
old_library='$old_library'

# Linker flags that cannot go in dependency_libs.
inherited_linker_flags='$new_inherited_linker_flags'

# Libraries that this one depends upon.
dependency_libs='$dependency_libs'

# Names of additional weak libraries provided by this library
weak_library_names='$weak_libs'

# Version information for $libname.
current=$current
age=$age
revision=$revision

# Is this an already installed library?
installed=$installed

# Should we warn about portability when linking against -modules?
shouldnotlink=$module

# Files to dlopen/dlpreopen
dlopen='$dlfiles'
dlpreopen='$dlprefiles'

# Directory that this library needs to be installed in:
libdir='$install_libdir'"
	  if test no,yes = "$installed,$need_relink"; then
	    $ECHO >> $output "\
relink_command=\"$relink_command\""
	  fi
	done
      }

      # Do a symbolic link so that the libtool archive can be found in
      # LD_LIBRARY_PATH before the program is installed.
      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
      ;;
    esac
    exit $EXIT_SUCCESS
}

if test link = "$opt_mode" || test relink = "$opt_mode"; then
  func_mode_link ${1+"$@"}
fi


# func_mode_uninstall arg...
func_mode_uninstall ()
{
    $debug_cmd

    RM=$nonopt
    files=
    rmforce=false
    exit_status=0

    # This variable tells wrapper scripts just to set variables rather
    # than running their programs.
    libtool_install_magic=$magic

    for arg
    do
      case $arg in
      -f) func_append RM " $arg"; rmforce=: ;;
      -*) func_append RM " $arg" ;;
      *) func_append files " $arg" ;;
      esac
    done

    test -z "$RM" && \
      func_fatal_help "you must specify an RM program"

    rmdirs=

    for file in $files; do
      func_dirname "$file" "" "."
      dir=$func_dirname_result
      if test . = "$dir"; then
	odir=$objdir
      else
	odir=$dir/$objdir
      fi
      func_basename "$file"
      name=$func_basename_result
      test uninstall = "$opt_mode" && odir=$dir

      # Remember odir for removal later, being careful to avoid duplicates
      if test clean = "$opt_mode"; then
	case " $rmdirs " in
	  *" $odir "*) ;;
	  *) func_append rmdirs " $odir" ;;
	esac
      fi

      # Don't error if the file doesn't exist and rm -f was used.
      if { test -L "$file"; } >/dev/null 2>&1 ||
	 { test -h "$file"; } >/dev/null 2>&1 ||
	 test -f "$file"; then
	:
      elif test -d "$file"; then
	exit_status=1
	continue
      elif $rmforce; then
	continue
      fi

      rmfiles=$file

      case $name in
      *.la)
	# Possibly a libtool archive, so verify it.
	if func_lalib_p "$file"; then
	  func_source $dir/$name

	  # Delete the libtool libraries and symlinks.
	  for n in $library_names; do
	    func_append rmfiles " $odir/$n"
	  done
	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"

	  case $opt_mode in
	  clean)
	    case " $library_names " in
	    *" $dlname "*) ;;
	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
	    esac
	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
	    ;;
	  uninstall)
	    if test -n "$library_names"; then
	      # Do each command in the postuninstall commands.
	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
	    fi

	    if test -n "$old_library"; then
	      # Do each command in the old_postuninstall commands.
	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
	    fi
	    # FIXME: should reinstall the best remaining shared library.
	    ;;
	  esac
	fi
	;;

      *.lo)
	# Possibly a libtool object, so verify it.
	if func_lalib_p "$file"; then

	  # Read the .lo file
	  func_source $dir/$name

	  # Add PIC object to the list of files to remove.
	  if test -n "$pic_object" && test none != "$pic_object"; then
	    func_append rmfiles " $dir/$pic_object"
	  fi

	  # Add non-PIC object to the list of files to remove.
	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
	    func_append rmfiles " $dir/$non_pic_object"
	  fi
	fi
	;;

      *)
	if test clean = "$opt_mode"; then
	  noexename=$name
	  case $file in
	  *.exe)
	    func_stripname '' '.exe' "$file"
	    file=$func_stripname_result
	    func_stripname '' '.exe' "$name"
	    noexename=$func_stripname_result
	    # $file with .exe has already been added to rmfiles,
	    # add $file without .exe
	    func_append rmfiles " $file"
	    ;;
	  esac
	  # Do a test to see if this is a libtool program.
	  if func_ltwrapper_p "$file"; then
	    if func_ltwrapper_executable_p "$file"; then
	      func_ltwrapper_scriptname "$file"
	      relink_command=
	      func_source $func_ltwrapper_scriptname_result
	      func_append rmfiles " $func_ltwrapper_scriptname_result"
	    else
	      relink_command=
	      func_source $dir/$noexename
	    fi

	    # note $name still contains .exe if it was in $file originally
	    # as does the version of $file that was added into $rmfiles
	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
	    if test yes = "$fast_install" && test -n "$relink_command"; then
	      func_append rmfiles " $odir/lt-$name"
	    fi
	    if test "X$noexename" != "X$name"; then
	      func_append rmfiles " $odir/lt-$noexename.c"
	    fi
	  fi
	fi
	;;
      esac
      func_show_eval "$RM $rmfiles" 'exit_status=1'
    done

    # Try to remove the $objdir's in the directories where we deleted files
    for dir in $rmdirs; do
      if test -d "$dir"; then
	func_show_eval "rmdir $dir >/dev/null 2>&1"
      fi
    done

    exit $exit_status
}

if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
  func_mode_uninstall ${1+"$@"}
fi

test -z "$opt_mode" && {
  help=$generic_help
  func_fatal_help "you must specify a MODE"
}

test -z "$exec_cmd" && \
  func_fatal_help "invalid operation mode '$opt_mode'"

if test -n "$exec_cmd"; then
  eval exec "$exec_cmd"
  exit $EXIT_FAILURE
fi

exit $exit_status


# The TAGs below are defined such that we never get into a situation
# where we disable both kinds of libraries.  Given conflicting
# choices, we go for a static library, that is the most portable,
# since we can't tell whether shared libraries were disabled because
# the user asked for that or because the platform doesn't support
# them.  This is particularly important on AIX, because we don't
# support having both static and shared libraries enabled at the same
# time on that platform, so we default to a shared-only configuration.
# If a disable-shared tag is given, we'll fallback to a static-only
# configuration.  But we'll never go from static-only to shared-only.

# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
build_libtool_libs=no
build_old_libs=yes
# ### END LIBTOOL TAG CONFIG: disable-shared

# ### BEGIN LIBTOOL TAG CONFIG: disable-static
build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
# ### END LIBTOOL TAG CONFIG: disable-static

# Local Variables:
# mode:shell-script
# sh-indentation:2
# End:
lib64/libapr-1.la000075500000001677150336140420007425 0ustar00# libapr-1.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.6
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libapr-1.so.0'

# Names of this library.
library_names='libapr-1.so.0.7.6 libapr-1.so.0 libapr-1.so'

# The name of the static archive.
old_library='libapr-1.a'

# Linker flags that cannot go in dependency_libs.
inherited_linker_flags=' -pthread'

# Libraries that this one depends upon.
dependency_libs=' -lpthread -ldl'

# Names of additional weak libraries provided by this library
weak_library_names=''

# Version information for libapr-1.
current=7
age=7
revision=6

# Is this an already installed library?
installed=yes

# Should we warn about portability when linking against -modules?
shouldnotlink=no

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/opt/cpanel/ea-apr16/lib64'
lib64/libaprutil-1.la000064400000002015150336140420010303 0ustar00# libaprutil-1.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.6
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libaprutil-1.so.0'

# Names of this library.
library_names='libaprutil-1.so.0.6.3 libaprutil-1.so.0 libaprutil-1.so'

# The name of the static archive.
old_library=''

# Linker flags that cannot go in dependency_libs.
inherited_linker_flags=' -pthread'

# Libraries that this one depends upon.
dependency_libs=' -lexpat -ldb-5.3 -lcrypt /opt/cpanel/ea-apr16/lib64/libapr-1.la -lpthread -ldl'

# Names of additional weak libraries provided by this library
weak_library_names=''

# Version information for libaprutil-1.
current=6
age=6
revision=3

# Is this an already installed library?
installed=yes

# Should we warn about portability when linking against -modules?
shouldnotlink=no

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/opt/cpanel/ea-apr16/lib64'
lib64/libapr-1.a000075500001465474150336140420007263 0ustar00!<arch>
/               1747905038  0     0     0       14068     `
T787878787878787878787878787878787878787878787878���������������������������������������������`����������������������������^�^�^�^�^�^�^�^�^�^�^�^�^�sXsX|��0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d��������������������������������������&�&�&�&�&�&�2�2�9�9�C�C�C�C�C�C�C�C�C�W�W�W�W�W�W�`�`�`�n�n�n�n�n�n�n�xx�d�d�d�d�d�d�d�P�P���������t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t� � � � � � � � �D�D�D�D�D�D�D�D�D�D�D�D�D
�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�� � � � � � � �������������������������������L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�P�P�4�4�4���3838383838A�A�J`J`J`J`TTZ(_,_,_,j0t������������������������ � � � � � � � � � � � � � � �$��������������������������������������������������+�+�+�@�@�@�@�@�@�@�MxMxMxMxMxMxMxMxMx_p\p\p\|�|�|�|�|�|�|�|�|�� � � � � � �������������������������������,ϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐ�((((((((3�3�3�3�3�3�3�3�>�>�>�>�>�>�>�>�>�>�>�>�>�>�N`N`N`N`N`Z�Z�a�a�a�a�apr_encode_base64apr_encode_base64_binaryapr_pencode_base64apr_pencode_base64_binaryapr_decode_base64apr_decode_base64_binaryapr_pdecode_base64apr_pdecode_base64_binaryapr_encode_base32apr_encode_base32_binaryapr_pencode_base32apr_pencode_base32_binaryapr_decode_base32apr_decode_base32_binaryapr_pdecode_base32apr_pdecode_base32_binaryapr_encode_base16apr_encode_base16_binaryapr_pencode_base16apr_pencode_base16_binaryapr_decode_base16apr_decode_base16_binaryapr_pdecode_base16apr_pdecode_base16_binaryapr_escape_shellapr_pescape_shellapr_unescape_urlapr_punescape_urlapr_escape_path_segmentapr_pescape_path_segmentapr_escape_pathapr_pescape_pathapr_escape_urlencodedapr_pescape_urlencodedapr_escape_entityapr_pescape_entityapr_unescape_entityapr_punescape_entityapr_escape_echoapr_pescape_echoapr_escape_hexapr_pescape_hexapr_unescape_hexapr_punescape_hexapr_escape_ldapapr_pescape_ldapapr_password_getapr_cpystrnapr_tokenize_to_argvapr_filepath_name_getapr_collapse_spacesapr_cstr_match_glob_listapr_cstr_match_listapr_cstr_tokenizeapr_cstr_split_appendapr_cstr_splitapr_cstr_count_newlinesapr_cstr_casecmpapr_cstr_casecmpnapr_cstr_strtoui64apr_cstr_atoui64apr_cstr_atouiapr_cstr_strtoi64apr_cstr_atoi64apr_cstr_atoiapr_cstr_skip_prefixapr_fnmatchapr_fnmatch_testapr_match_globapr_vformatterapr_snprintfapr_vsnprintfapr_pstrndupapr_pstrmemdupapr_pmemdupapr_pstrdupapr_pstrcatapr_pstrcatvapr_strtoffapr_strtoi64apr_atoi64apr_itoaapr_ltoaapr_off_t_toaapr_strfsizeapr_strnatcmpapr_strnatcasecmpapr_strtokapr_hash_makeapr_hash_make_customapr_hash_nextapr_hash_firstapr_hash_thisapr_hash_this_keyapr_hash_this_key_lenapr_hash_this_valapr_hashfunc_defaultapr_hash_copyapr_hash_getapr_hash_setapr_hash_countapr_hash_clearapr_hash_mergeapr_hash_overlayapr_hash_doapr_hash_pool_getapr_skiplist_allocapr_skiplist_freeapr_skiplist_add_indexapr_skiplist_set_compareapr_skiplist_initapr_skiplist_find_compareapr_skiplist_findapr_skiplist_last_compareapr_skiplist_lastapr_skiplist_getlistapr_skiplist_nextapr_skiplist_previousapr_skiplist_elementapr_skiplist_insert_compareapr_skiplist_insertapr_skiplist_add_compareapr_skiplist_addapr_skiplist_replace_compareapr_skiplist_replaceapr_skiplist_remove_nodeapr_skiplist_remove_compareapr_skiplist_removeapr_skiplist_remove_allapr_skiplist_popapr_skiplist_peekapr_skiplist_sizeapr_skiplist_heightapr_skiplist_preheightapr_skiplist_set_preheightapr_skiplist_destroyapr_skiplist_mergeapr_is_empty_arrayapr_array_makeapr_array_clearapr_array_popapr_array_pushapr_array_catapr_array_copyapr_array_copy_hdrapr_array_appendapr_array_pstrcatapr_table_eltsapr_is_empty_tableapr_table_makeapr_table_copyapr_table_clearapr_table_getapr_table_setapr_table_setnapr_table_unsetapr_table_mergeapr_table_mergenapr_table_addapr_table_cloneapr_table_addnapr_table_overlayapr_table_vdoapr_table_doapr_table_compressapr_table_overlapapr_table_getmapr_atomic_initapr_atomic_read32apr_atomic_set32apr_atomic_add32apr_atomic_sub32apr_atomic_inc32apr_atomic_dec32apr_atomic_cas32apr_atomic_xchg32apr_atomic_casptrapr_atomic_xchgptrapr_atomic_read64apr_atomic_set64apr_atomic_add64apr_atomic_sub64apr_atomic_inc64apr_atomic_dec64apr_atomic_cas64apr_atomic_xchg64apr_os_dso_handle_putapr_os_dso_handle_getapr_dso_loadapr_dso_unloadapr_dso_symapr_dso_errorapr_file_buffer_setapr_file_buffer_size_getapr_file_copyapr_file_appendapr_dir_openapr_dir_closeapr_dir_readapr_dir_rewindapr_dir_makeapr_dir_make_recursiveapr_dir_removeapr_os_dir_getapr_os_dir_putapr_file_name_getapr_file_flags_getapr_unix_perms2modeapr_unix_mode2permsapr_file_data_getapr_file_data_setapr_file_dupapr_file_dup2apr_file_setasideapr_filepath_getapr_filepath_setapr_filepath_rootapr_filepath_mergeapr_filepath_list_splitapr_filepath_list_mergeapr_filepath_encodingapr_filepath_list_split_implapr_filepath_list_merge_implapr_file_info_get_lockedapr_file_info_getapr_file_perms_setapr_statapr_file_attrs_setapr_file_mtime_setapr_stat_fdapr_file_lockapr_file_unlockapr_file_read_fullapr_file_write_fullapr_file_writev_fullapr_file_mktempapr_unix_file_cleanupapr_unix_child_file_cleanupapr_file_openapr_file_closeapr_file_removeapr_file_renameapr_os_file_getapr_os_file_putapr_file_eofapr_file_open_flags_stderrapr_file_open_flags_stdoutapr_file_open_flags_stdinapr_file_open_stderrapr_file_open_stdoutapr_file_open_stdinapr_file_inherit_setapr_file_inherit_unsetapr_file_pool_getapr_file_linkapr_file_pipe_timeout_setapr_file_pipe_timeout_getapr_os_pipe_put_exapr_os_pipe_putapr_file_pipe_createapr_file_pipe_create_exapr_file_pipe_create_poolsapr_file_namedpipe_createapr_file_readapr_file_writeapr_file_writevapr_file_putcapr_file_ungetcapr_file_getcapr_file_putsapr_file_flush_lockedapr_file_flushapr_file_syncapr_file_datasyncapr_file_getsapr_file_printfapr_file_seekapr_file_truncapr_temp_dir_getapr_global_mutex_createapr_global_mutex_child_initapr_global_mutex_lockapr_global_mutex_trylockapr_global_mutex_timedlockapr_global_mutex_unlockapr_os_global_mutex_getapr_global_mutex_destroyapr_global_mutex_lockfileapr_global_mutex_mechapr_global_mutex_nameapr_global_mutex_perms_setapr_global_mutex_pool_getapr_proc_mutex_cleanupapr_proc_mutex_destroyapr_proc_mutex_unix_setup_lockapr_proc_mutex_defnameapr_proc_mutex_createapr_proc_mutex_child_initapr_proc_mutex_lockapr_proc_mutex_trylockapr_proc_mutex_timedlockapr_proc_mutex_unlockapr_proc_mutex_mechapr_proc_mutex_nameapr_proc_mutex_lockfileapr_proc_mutex_perms_setapr_proc_mutex_pool_getapr_os_proc_mutex_get_exapr_os_proc_mutex_getapr_os_proc_mutex_put_exapr_os_proc_mutex_putapr_thread_cond_createapr_thread_cond_waitapr_thread_cond_timedwaitapr_thread_cond_signalapr_thread_cond_broadcastapr_thread_cond_destroyapr_thread_cond_pool_getapr_thread_mutex_createapr_thread_mutex_lockapr_thread_mutex_trylockapr_thread_mutex_timedlockapr_thread_mutex_unlockapr_thread_mutex_destroyapr_thread_mutex_pool_getapr_thread_rwlock_createapr_thread_rwlock_rdlockapr_thread_rwlock_tryrdlockapr_thread_rwlock_wrlockapr_thread_rwlock_trywrlockapr_thread_rwlock_unlockapr_thread_rwlock_destroyapr_thread_rwlock_pool_getapr_allocator_createapr_allocator_destroyapr_allocator_mutex_setapr_allocator_mutex_getapr_allocator_owner_setapr_allocator_owner_getapr_allocator_max_free_setapr_allocator_alignapr_allocator_allocapr_allocator_freeapr_pallocapr_pcallocapr_pool_destroyapr_pool_terminateapr_pool_clearapr_pool_create_exapr_pool_initializeapr_pool_create_unmanaged_exapr_pool_create_core_exapr_pvsprintfapr_psprintfapr_pool_abort_setapr_pool_abort_getapr_pool_parent_getapr_pool_allocator_getapr_pool_is_ancestorapr_pool_tagapr_pool_userdata_getapr_pool_cleanup_registerapr_pool_userdata_setapr_pool_userdata_setnapr_pool_pre_cleanup_registerapr_pool_cleanup_killapr_pool_child_cleanup_setapr_pool_cleanup_runapr_pool_cleanup_for_execapr_pool_cleanup_nullapr_pool_note_subprocessapr_palloc_debugapr_pcalloc_debugapr_pool_clear_debugapr_pool_destroy_debugapr_pool_create_ex_debugapr_pool_create_core_ex_debugapr_pool_create_unmanaged_ex_debugapr_os_default_encodingapr_os_locale_encodingapr_env_getapr_env_setapr_env_deleteapr_strerrorapr_getopt_initapr_getoptapr_getopt_longapr_proc_other_child_registerapr_proc_other_child_unregisterapr_proc_other_child_alertapr_proc_other_child_refreshapr_proc_other_child_refresh_allapr_os_uuid_getapr_generate_random_bytesapr_initializeapr_app_initializeapr_terminateapr_terminate2apr_versionapr_version_stringapr_mmap_offsetapr_mmap_createapr_mmap_dupapr_mmap_deleteapr_inet_ntopapr_inet_ptonapr_mcast_joinapr_mcast_leaveapr_mcast_hopsapr_mcast_loopbackapr_mcast_interfaceapr_socket_sendapr_socket_recvapr_socket_sendtoapr_socket_recvfromapr_socket_sendvapr_socket_sendfileapr_sockaddr_ip_getbufapr_sockaddr_ip_getapr_sockaddr_vars_setapr_socket_addr_getapr_parse_addr_portapr_sockaddr_info_getapr_sockaddr_info_copyapr_getnameinfoapr_getservbynameapr_sockaddr_equalapr_sockaddr_is_wildcardapr_ipsubnet_createapr_ipsubnet_testapr_sockaddr_zone_setapr_sockaddr_zone_getapr_socket_atreadeofapr_socket_protocol_getapr_socket_createapr_socket_shutdownapr_socket_closeapr_socket_bindapr_socket_listenapr_socket_acceptapr_socket_connectapr_socket_type_getapr_socket_data_getapr_socket_data_setapr_os_sock_getapr_os_sock_makeapr_os_sock_putapr_socket_pool_getapr_socket_inherit_setapr_socket_inherit_unsetapr_socket_timeout_setapr_socket_opt_setapr_socket_timeout_getapr_socket_opt_getapr_socket_atmarkapr_gethostnameapr_socket_perms_setapr_pollcb_provider_epollapr_pollset_provider_epollapr_pollapr_pollcb_provider_pollapr_pollset_provider_pollapr_pollcb_create_exapr_pollcb_createapr_pollcb_addapr_pollcb_removeapr_pollcb_pollapr_pollcb_wakeupapr_pollcb_method_nameapr_pollset_create_exapr_pollset_method_nameapr_poll_method_defnameapr_pollset_createapr_pollset_destroyapr_pollset_wakeupapr_pollset_addapr_pollset_removeapr_pollset_pollapr_pollset_provider_selectapr_poll_create_wakeup_pipeapr_poll_close_wakeup_pipeapr_poll_drain_wakeup_pipeapr_random_initapr_random_after_forkapr_random_standard_newapr_random_add_entropyapr_random_secure_bytesapr_random_insecure_bytesapr_random_barrierapr_random_secure_readyapr_random_insecure_readyapr__SHA256_Initapr__SHA256_Transformapr__SHA256_Updateapr__SHA256_Finalapr__SHA256_Endapr__SHA256_Dataapr_crypto_sha256_newapr_shm_createapr_shm_create_exapr_shm_removeapr_shm_deleteapr_shm_destroyapr_shm_attachapr_shm_attach_exapr_shm_detachapr_shm_baseaddr_getapr_shm_size_getapr_shm_perms_setapr_shm_pool_getapr_os_shm_getapr_os_shm_putapr_wait_for_io_or_timeoutapr_lve_environment_initapr_lve_environment_init_groupapr_lve_environment_init_group_minuidapr_procattr_createapr_procattr_io_setapr_procattr_child_in_setapr_procattr_child_out_setapr_procattr_child_err_setapr_procattr_dir_setapr_procattr_cmdtype_setapr_procattr_detach_setapr_proc_forkapr_procattr_child_errfn_setapr_procattr_error_check_setapr_procattr_addrspace_setapr_procattr_user_setapr_procattr_group_setapr_proc_createapr_proc_waitapr_proc_wait_all_procsapr_procattr_limit_setapr_procattr_perms_set_registerapr_proc_detachapr_proc_killapr_signalapr_signal_initapr_signal_description_getapr_signal_threadapr_setup_signal_threadapr_signal_blockapr_signal_unblockapr_threadattr_createapr_threadattr_detach_setapr_threadattr_detach_getapr_threadattr_stacksize_setapr_threadattr_guardsize_setapr_thread_createapr_os_thread_currentapr_os_thread_equalapr_thread_exitapr_thread_joinapr_thread_detachapr_thread_yieldapr_thread_data_getapr_thread_data_setapr_os_thread_getapr_os_thread_putapr_thread_once_initapr_thread_onceapr_thread_pool_getapr_threadkey_private_createapr_threadkey_private_getapr_threadkey_private_setapr_threadkey_private_deleteapr_threadkey_data_getapr_threadkey_data_setapr_os_threadkey_getapr_os_threadkey_putapr_time_ansi_putapr_time_nowapr_time_exp_tzapr_time_exp_gmtapr_time_exp_ltapr_time_exp_getapr_time_exp_gmt_getapr_os_imp_time_getapr_os_exp_time_getapr_os_imp_time_putapr_os_exp_time_putapr_sleepapr_unix_setup_timeapr_time_clock_hiresapr_rfc822_dateapr_day_snamesapr_month_snamesapr_ctimeapr_strftimeapr_gid_name_getapr_gid_getapr_uid_homepath_getapr_uid_currentapr_uid_getapr_uid_name_getapr_encode.o/   1747905038  1000  135   100644  19520     `
ELF>�H@@
AUM��ATA��UH��SH��H��H����H�����H���H��H����A��A��LE�H����I��E1�L9�vpJ�LH��A�������A�A�L9��tJ�t��������0��	�I�QH�A�A�A�����<A�A�AI��E��u�=L�JA�L��1�H)�M��tI�UH��[]A\A]�H����H��t
�H��t�H��H���!���H���������H�VH��H��H��H��H9���Ѓ��f�H�V�H��I��E1��I��I��H������A�A�A��G��O�������0��	�H�A�A�A��G��O�������<��	�H�A�A�A��G���?A�A�A�I9�r����fDH���H��%i[]��A\A]�������0A�A�AE��uI�QA�A=���I�����ff.�@H����ATUSH��H��t�H����H���\��A��LE�H����I��E1�I9�smJ�H���������A�A�L9��HJ�t��������0��	�I�QH�A�A�A�����<A�A�AI�х�u�=L�JA�L��1�H)�M��tI�[]A\��H���%i��ÐH�k�H��I��E1��I��I��H������A�A�A��B�D�b���A����0E��D	�H�A�A�A��B�D�b���A����<E��D	�H�A�A�A��B���?A�A�A�I9�r�����fDH���������H�SH��H��H��H��H9���Ѓ�����f.������0A�A�A��uI�QA�A=����@I������ff.�@AVAUATUSH��H��t_M��H��L�D$1�A��H��I�����u@H�t$H���H��H��t-M��D��H��L��H���H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��t{H��E1�H��x$H�BH��H���������H��H��H�4�H9�r[L��]A\A]A^��M��A���I��H��t�M��D��H��H��H���[L��]A\A]A^�DE1��AUA��ATM��UH��SH��H��H����H����wH���H��H�����H������?v�@���?��H��H��u�H)�1�I��H����I���eI�x�H��H��H��H�4��fD���D�K��H��H��E��A��D	ʈQ��S�����A���S�����D	ʈQ��S�D�K�����A
��Q�H9�u�H�A��H�I���hvT����<��N����	��
I���j�NH�������N������	��J��H��H)�M��ufH��[]A\A]ÐH����H��t
�H��t�H��H���p���H����1�H�<vH�OH����H����H���6ND�M��t�I�$H��[]A\A]��I��I)�D���u2H��v]�|�L���f�H���H��%i[]��A\A]��1�H���(���L��L��H����H�<vH�O�`���H�������H���7��@w��@H�Ѹ6N�H)����DH�Lv�;���fDH�O�,���H�����H��1��H�����������E1��$���H��H���)���AUA��ATM��UH��SH��H��H���yH����oH���H��H���u�H����@��?v�p���?��H��H��u�H)�1�I��H����I���@M�H�H��I��I��J�<��fD����S��H��H������	�@�q��S������S�������	�Q��S��s�����
��Q�H9�u�K�IA��H�I���WvT����4��W����	�I���Q�WH�������W������	�Q�H)�H��M��udH��[]A\A]�H���H��t
�H��t�H���{���H��H��1���H�RH����H����H���6ND�M��t�I�$H��[]A\A]�I��I)�D���u2H��vU�|�\���f�H���H��%i[]��A\A]��1�H���8���L��I����K�@�k���f�H������H�����@w��@H)�6NH�����H���P����H���@���H������H��1�H��������$���E1��9���H��H���G����AVAUATUSH��H��t_M��H��L�D$1�A��H��I�����u@H�t$H���H��H��t-M��D��H��L��H���H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��toM��H��L�D$1�A��I��H�����uPH�D$H��H�p�H��H��t9M��D��L��H��H���H�D$�H��H��[]A\A]A^�f.�1�H��H��[]A\A]A^�ff.�AUM��ATA��UH��SH��H��H���aH����WH���H��H���gA��A��LE�H���vH��E1�L9���J�TA�������A��H�F�L9��aN�L�A���������	�H�E�H�F�L9��cD�_A�J�LH�����A��GA����������	�H�A��GL9���J�t���������	�H�A��G�����A��G�����A��GE��� �G=H����H��1�H)�M��tI�UH��[]A\A]ÐH���GH��t
�H��t�H��H�������H���������H�VH��H��H��H��H9���Ѓ��H�V�H��H��E1��H��I��H������A�
�O��H�D�H���A����E��D	�Hc�A�
�O��H����A�
�O��H�D�H���A����E��D	�Hc�A�
�O��H�D�H��A����E��D	�Hc�A�
�O��H�����A�
�O�D�H��H�A����A����A	�Mc�C�
�O��H���A�
�O�I9��������H���H��%i[]��A\A]�������A��GE��uZ�==�G====H��f�W��A����D�_A����A��GA�����H�A��GE��u2�G====H������f�H������H������H�����������A��GE��t	H������==�G=H��f�G����ff.��H���_ATUSH��H��t�H���9H���d��A��LE�H���8I��E1�I9���J��������A�A�H�C�L9��DJ�l��U��������	�H�E�$H�C�L9���E�a�EH��J�T���A�A�A�E����L9��,�J�t����	�H�A�A�A���������	�H�A�A�A�����A�A�A�����A�A�A���?I��A�L��1�H)�M��tI�[]A\��H���%i���f�H�k�H��I��E1��I��I��H������A�A�Q��P�D�`���A����E��D	�Hc�A�A�Q��P����A�A�Q��P�D�`���A����E��D	�Hc�A�A�Q��P�D�`��A����E��D	�Hc�A�A�Q��P�����A�A�Q��P�D�`���A����E��D	�Hc�A�A�Q��P���A�A�Q�I9��
��������H���������H�SH��H��H��H��H9���Ѓ����������A�A�A��u"�==A�A====I��fA�Q��W����I���G�����2@��@��	�H�A�A�A����A�A�A��tlI���
���f�E�a�E���A�A�A�E����H�A�A�A��t!I�������A�A=I�����f�A�A====I������==A�A=I��fA�A�����AVAUATUSH��H��t_M��H��L�D$1�A��H��I�����u@H�t$H���H��H��t-M��D��H��L��H���H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��t{H��E1�H��x%H�BH��H���������H��H��H�4�H9�r[L��]A\A]A^��M��A���I��H��t�M��D��H��H��H���[L��]A\A]A^�DE1��AUA��ATM��UH��SH��H��H����H�����H���H��A����HD�H���Z�H�߀<v�]��<��H��H��u�H)�1�I��H���zI���3M�A�H��I��I��J�<��H��H���D���S����D	҈Q��S�D�S��F���E�D	�D�S�F�A��D	҈Q��S����A���S����D	҈Q��S�D�S��F���A��D	�D�S�F�A��D	҈Q��S�D�S����B
�Q�H9��;���K��A��H�I������L�B�D���O���D	ш
I�����6NA�L��H)�M��tI�$H��[]A\A]��H��x[H��t
�H��t�I��1�H���2���L��A��H��H��H�QB�$�I��I)�D���u2H��vE�|�A���f�H���H��%i[]��A\A]��1�����f�H������H����< w���L��I�����OD�G�F���E�D	�D�GF�A��D	��
I�����OL�B���A���O���D	шJI�������I��������OD�OL�B��F��4>��A��D	�@��	�J�y�����6NH�Q�n���f.��6NH�Q�V���f��6NI���=����6N�:���fDH�Q�+����H�Q����H��1�H��uº����E1��a���H��H�����H���f.�AUA��ATM��UH��SH��H��H����H�����H���H��A����HD�H���Z�H�߀<v�X��<��H��H��u�H)�1�I��H���zI���.M�A�H��I��I��J�<��H��H���D���S����D	҈Q��S�D�S��F���E�D	�D�S�F�A��D	҈Q��S����A���S����D	҈Q��S�D�S��F���A��D	�D�S�F�A��D	҈Q��S�D�S����B
�Q�H9��;���K��A��H�I�����D�H�QF�F��D�GF�A��E	�D�I�����6NH)�M��tI�$H��[]A\A]�f�H��x[H��t
�H��t�I��1�H���2���L��A��H��H��H��B�$�@I��I)�D���u2H��vE�|�A���f�H���H��%i[]��A\A]��1�����f�H������H����< w���H��I�����WD�G�F���E�D	�D�GF�A��D	ˆI����D�GH�QF�A��E��D�GF�A��E	�D�AI�������I�������D�GD�OH�Q�F�F��4>A��A��E	�@��D	�@�q�s����6NH�Q�e���f��6NH�Q�U���f��6NH���C����6N�9���fDH�Q�*����H�Q����H��1�H��u�����E1��f���H��H�����H���ff.�@AVAUATUSH��H��t_M��H��L�D$1�A��H��I�����u@H�t$H���H��H��t-M��D��H��L��H���H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��toM��H��L�D$1�A��I��H�����uPH�D$H��H�p�H��H��t9M��D��L��H��H���H�D$�H��H��[]A\A]A^�f.�1�H��H��[]A\A]A^�ff.�AUA��ATM��UH��SH��H��H����H�����H���H��H����A�� A�D��I��LD�E1Ƀ�H��u��f.���t	A�B:I�rI��B�<I�r@��@��A�;A�B�<I����A�;A�BL9�u�H��H)��1�M��tI�$H��[]A\A]�fDH��xSH���N����H���@���H��[]A\A]ÐH�LH9���Ѓ�A��t�H��v�H�T
�H9�H��r��돐H���H��%i[]��A\A]��1�H���_���fDH����H��t�H��u��H������ S��HD�I��E1Ƀ�H��u�f���t	A�B:M�ZM��B�M�Z�����A�B�I�����A�BL9�u�L��H)�A�1�M��tI�0[�H���%i���f�H�tH9���Ѓ���tH��wM���5���I�0�f�H�T�H9�H��rݸ��@I��1�놐AVAUATUSH��H��t_M��H��L�D$1�A��H��I�����u@H�t$H���H��H��t-M��D��H��L��H���H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��t_M��H��L�D$1�A��H��I�����u@H�t$H���H��H��t-M��D��H��L��H���H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AUA��ATM��UH��SH��H��H����H�����H���H��E��H�4;H��A��A��A��H����D�����vE���H�� �?H��H9�u�1�H��H)�H����H��H��w.�S��s��H��H��H��
��B�H��v���< u�H��H��H��w�H��H)�H���6ND��M����H����[]A\A]��H����H��t
�H��t�H��H�������1�A��tAH��t&H���������H�wH��H��H��H�RH9Ƹ6NE�H���������H��H��H��H)�@���6NE�H��H�GM���c���I�$H����[]A\A]�fDD��H�ƃ���Ɂ�|����H���H����i[]��A\A]���1���H��tH��1�1����D����y���1��P����AUA��ATM��UH��SH��H��H����H�����H���H��E��H�4;H��A��A��A��H����D�����vE���@�� �7H��H9�u�1�H��H)�H����H���OH���(fD�s��H��H��H��
��B�H��v���< u�H��H��H��w�H)�H���6ND�M����H����[]A\A]�DH����H��t
�H��t�H��H������1�A��tAH��t&H���������H�wH��H��H��H�RH9Ƹ6NE�H���������H��H��H��H)�@���6NE�H��H��M���f���I�$H����[]A\A]��D��H�ƃ���Ɂ�|����H���H����i[]��A\A]���1����1�1�H��u�D���t�1��\���DAVAUATUSH��H��t_M��H��L�D$1�A��H��I�����u@H�t$H���H��H��t-M��D��H��L��H���H��H��[]A\A]A^��1�H��H��[]A\A]A^�ff.�AVAUATUSH��H��toM��H��L�D$1�A��I��H�����uPH�D$H��H�p�H��H��t9M��D��L��H��H���H�D$�H��H��[]A\A]A^�f.�1�H��H��[]A\A]A^�0123456789abcdef0123456789ABCDEF0123456789ABCDEFGHIJKLMNOPQRSTUVABCDEFGHIJKLMNOPQRSTUVWXYZ234567ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/	 



                                                	   �   

                                                                                                                                                                                                                                �   	

                                                                                                                                                                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@?456789:;<=@@@�@@@	

@@@@?@ !"#$%&'()*+,-./0123@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�L1B�E�D �D(�G0�
(A ABBD�
(F AEBH4l�K�A�A ��ABH���P ���T��B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBL��B�B�B �A(�A0�u
(D BBBIh
(D BBBF`L�B�E�D �D(�G0�
(A ABBBb
(A ABBHj
(F AEBH`��B�E�D �D(�G0x
(A ABBD^
(A ABBDj
(F AEBHT�B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBTl�B�B�B �A(�A0�D@^
0D(A BBBKF0D(A BBBL��B�E�D �D(�G0b
(A ABBBZ
(F AEBH4�K�A�A �PABH���X ���TL�B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBL��B�B�B �A(�A0�v
(D BBBHh
(D BBBFL��B�E�D �D(�G0�
(A ABBIj
(F AEBHLD�B�E�D �D(�G0�
(A ABBJj
(F AEBHT��B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBT��B�B�B �A(�A0�D@^
0D(A BBBKF0D(A BBB\DZB�E�D �D(�G0�
(A ABBG`
(A ABBBz
(F AEBH �m�wD�`�T��B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBT �B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBB\xB�E�D �D(�G0�
(C ABBH�
(C ABBGj
(G AEBC\�B�E�D �D(�G0�
(C ABBF�
(C ABBHj
(G AEBCT8�B�B�B �A(�A0�D@Q
0D(A BBBHF0D(A BBBX��B�B�B �A(�A0�D@^
0D(A BBBKF0D(A BBB��A@Ag!�!'/��;	B1T[@�t@������`��`��@����p�@�/�B��\ �n�����p��Z�p�� ��!��!�#7�%�J`&�base64urlpr2sixbase32hexpr2fivehexpr2fivebase16lowerpr2twoapr_encode_base64strlenapr_encode_base64_binaryapr_pencode_base64apr_pallocapr_pencode_base64_binaryapr_decode_base64apr_decode_base64_binaryapr_pdecode_base64apr_pdecode_base64_binaryapr_encode_base32apr_encode_base32_binaryapr_pencode_base32apr_pencode_base32_binaryapr_decode_base32apr_decode_base32_binaryapr_pdecode_base32apr_pdecode_base32_binaryapr_encode_base16apr_encode_base16_binaryapr_pencode_base16apr_pencode_base16_binaryapr_decode_base16apr_decode_base16_binaryapr_pdecode_base16apr_pdecode_base16_binary-��������C
	�H
	@q
	�v
	@h��������y�����������������'��������C������������������	�		&	;	L	e	o	�	�	�	�	�	����������	�			$		8		H		_		h		�		�		�		�		�
	h��������y��������������������������
��������)������������������
	�
	�q
	v
	�(��������9��������U�������������������������M��������Y
	^
	9	-��������9
	>
		@ ����������������5 ���������!������������������!��������=��������S
	�^
	��
	��
	�� $��������� ��������� $��������8!%��������I!��������e!%���������!���������!	]"	p"	�#��������$	}$	�$	�%(��������	&��������%&(���������&)���������&���������&)������������ �(m0h8�@�H�PeX``�hUpPx� p@�@�P`�`@p��p@P��� H���pH�p�� $!|�!��#<�%�`&.symtab.strtab.shstrtab.rela.text.data.bss.rela.rodata.comment.note.GNU-stack.rela.eh_frame @�&@�;�&2',2'6@' 1@�D�>0@-.Gn-\p-�W@F@	X5 	x9dXHfapr_escape.o/   1747905038  1000  135   100644  20080     `
ELF>pJ@@H�����H��A����A��E!�H��toE����E1�A�L��5��\I��H��A��H����L9�������H�WM�H��u�H��M��H��H����H��E1�A�E��u#�H��tH���fD��t,M�A��t
M�AA�H��I���M��I)�I�u�H��tL�E��t�1������H��u��ff.�U1�SH��H��tr���t|H��E1ɹ��H���H��A���tL�A��u�H���L����u�E��t3H��H���1�H�����H��H��H���H��H��[]��H��H��H��[]�AWAVAUATUSH��8H�L$L�D$ H�����H��I��I����I�ׄ�@��!�H��������E���D$A�@���D$1��(A�$L��L�pI��I���@I�����t{<+u@��uB<%u��A�~H�0H���D~tE�NL��B�DN��A�$%L���D$또A�$ L���D$�fD�D$1�A��D$A�$H�|$ptH�D$pL�(�T$���/���7�D$����H��8��[]A\A]A^A_�f.��p�<@~��ߍpɉ�D�O��@��@~���D�O�A�t+H�|$H���zA��D�L$�D�L$H���]E�$I�FI������H�|$ptH�D$pH���[���fD��t�E���D$A����D$1��!@I��I��I�����@�������A�n<+u����<%uΈL$�@���L$H��Dp��A�~H���DxtwD�]�@��@~A��A���E�X�A���F�@��@~��ߍF�A�E��t)H�|$H����A��L$��L$H����A�nI��I����/�����D$����I���D$����H�|$ H��t`A��D�L$�D�L$H��tGA�$%I�FI��I��A�vA�t$�A�vA�4$����@�����fD�|����E�$I�FI���D$���H�|$ I�VI��A�nH���O���A��H�T$(�L$��L$H�T$(H���*���I��I���9����AVE��I��1�AUE��I��ATI��H��UH��H�����SH��H��H�D$P�Y^��tQ=|tJ��u6H�t$L���H��H��E��jI��H�����M��H��H��L���XZH��H��[]A\A]A^�H��1�H��[]A\A]A^�ff.�H���'�H��SA������A��E!�H����I��E1�A�E��u\�
f����%I��H��D��H��A�����D�G��G�I��I��A�I��M)�I��������A��A��u��H����fDH��E1�A�E��uH��tH��[�@��t4����t
I��A�H��I��I���I)�I�u�f�H��tL�	E��t�1�[�����H��tH���fD�H���r����t����U1�SH��H��t\���tdH��E1�����t
H��A�H���H����u�E��t1H��H���1�H�����H��H��H���H��H��[]�DH��H��H��[]�ff.�H����AVAUM��ATI��UH��SH������E1��H����E�ƅ�tpH��M��uO�ffD�����%H����H��A��C����C�H��L���H��H)�H��t��t���u�@�3H����D�M��tI�M1�E��tm[]A\A]A^�@�:H���I��H���<����/H���H��t	I9��!���H��t5�./H��A��f�C�����f.�[�]A\A]A^�A����EM���V���H���3fD��t
H��A�H��L��H���H)�H�������u�����f���f.�AT��I��1�U��H�����SH��H��L�D$���tH��H��[]A\�H�t$L�����H��E1�I��H�����H���L��H��H��[]A\�f�H���G�H��SA����A��A��E!�H����H��E1�A�E��uX�)���A���%I����H��A��G�A���G�H��I���I��I)�I�A��������A��A��u�L�O�� txD�L���H��E1�A��E��u>H��tH��[��I��A�H��I��I���I)�I�t;��t7A��A��uσ� DD���fD�+A�L���<�����H��tL�E��t�1�[�@H��tH���fD�H���W����Y����U1�SH��H���������H��E1ɺA���H���H��A�H����t#A��A��uڃ� ED�H���H����u�E��t/H��H���1�H�����H��H��H���H��H��[]�H��H��H��[]�H���7AWA��AVI��AUI��ATA�UH��SL��H���H���…ɉ�@��!�1�H������>fD��� ����"<�����$�@�E&gt;I��H���@H��L���H)�L��t��u��EM��tM� ����H��1�[]A\A]A^A_��E&lt;I��H����f��s;�E&apoI��H��f�E��뉐�E&ampI��H����E�;�k����t;�E&quoI��H��f�U���F���fD������� tXD��"<����$�I����H��L���H)�L���������������� u�E��t	�����I���f�I����DE��t���u�EI��H�����fD�H��1�L�D$��L�D$H�I�H��X���M��tI���fD��6���fDI����"���f.������fD�M��tI�H���[]A\A]A^A_�D1��1�1�L�D$��L�D$H�I����M��u���AT��I��1�U��H�����SH��H��L�D$���tH��H��[]A\�H�t$L�����H��E1�I��H�����H���L��H��H��[]A\�f�AWAVAUATUSH��8H�L$H����H���I��H��H��������!�H��������A��D$$�3f.�A�$I��I��I��L��A�VH���o���gL�C��&u��C���<;�
H���A�B�E��N�4��;������I�SL9���I����A��D$$��u[fDH�D$H��tH�H��8�[]A\A]A^A_�D��M�ƾA�����f�I��D��L��H��t3E��t.D�kL�CE��A�Ā�&u�A��;t�E��t�H���!I��H�D$H��tL�8�D$$���u���H��81�[]A\A]A^A_���M��A�A���u2I��A�$&I��I��L��A�VH�������f�A�$�Ic�H�L$(H9�t�<#��A��A���Ic�L�,�H�D$M��t�A�}u�@L�\$L�$M�A�}�v���H�T$L��L��L�\$L�$���u�H�D$I�^I��I��H+l$(�D$$A�DA�D$�����fDA�B�D��N�4��;����@��@ ��o���I�RL9�uI��A��D���h����I���Hc�H�D$(H9��J���A��#�M��I��D���4���Hc�H��H�D$H�������;u$����f.�L�T$L�$LӀ;���H�T$H��L��L�T$L�$���u�A�VH+l$(M�F�D$$��A�����DI�~A��~GH�<$�H�S1�H�<$L�A�E�L�\�D�4�H���p�p�L9�t4�D��C�DPu�H������H�D$�H������������~֍P�H�����P���-���!v�����A�4$I��I���D$$�%���A�VM�F�4$��A�ă�����L�D$�T$��4$�T$H�{L�L�D$�F�1�H�\@�D��C�DZ������4�H���p�p�H9�uۃ�������xŃ��u���-���!�g�������[���I���D$$�J���UH�����H��1�SH��H��H�L$���t
H��H��[]�H�t$H���H��1�H�����H��H���H��H��H��[]�ff.�@H����D�H��AUATUD��S��E��A��D!�H��tMI��1�A�����f�D��L�oM�c���0�X��\��U����$��H��1�A���u\M��tI�[�]A\A]Ð<"� ����<��I���fDH��I��D�I)�I�D��t\E��tWE��M�SA��u�M������GfI��H����I��H��E�
L)�H�D��t	E���	����M��tM����I���[1�]A\A]�D�G\I��H����D���`�G"I��H����D�GrI��H����r���f.��GbI��H����R���f.��GaI��H����2���f.��GnI��H�������f.��GtI��H�����f.��GvI��H�������f.�A�����GxI����H���E���G�D�O����D�M��L�����<\����I�������f�M��tI���fD��u�M����@�"M��L���2���f.��M����������ff.�@AT��I��1�U��H�����SH��H��L�D$���tH��H��[]A\�H�t$L�����H��E1�I��H�����H���L��H��H��[]A\�f�H����H��tfE1�I��H��tW�B�L�W�������B�I�������GL9�t��t�G:H����L���A�1�M��t��t!H��tH�RI��@��f.�H�DI�1��DH��t[ATUS��tCH��t>H�RH��H��A��H���D��H��H��E1�H��I���[]L��A\�f.�H�D�f�E1�L���f�AWAVAUATUSH��(�L$L�D$H����I��H��H����H�E1�E1�H�D$H�$�1�A�L$�A	�E����H�D$I�GE�/A��I��H���+A��H9$�/���'E��u�D$E1�t��:t��A��H��P��u���t	��F�����.��f�%A�L$�A	�E���u���A��L���s����H�D$H�E1�H�$�Bf.�A��:uME��t)�H��@t��u��u	����H�D$A��H��D�;E��H9$tRE��tM�T$��u��H�B�x��u��tA��Fv��tkA��fweE��t��fDA�L$�A	����H�|$t
H�D$H�t$H�01�H��([]A\A]A^A_�f�H�|$tH�D$H����DH��(�|[]A\A]A^A_�ff.��AVI��1�AUI�͉�ATA��H�����UH��S1�H��L�D$���u(H�t$L���M��D��H��H�����H��H���H��H��[]A\A]A^�DH���/UA�1�L�SH�����˃����?fDL9�����t
A��A��@u?��t
A��A��x.�H��H��I����…�u�M��I)�M������u��t�����\I����H����G����G���ʃ����/fDL9�tV��t���@u/��t	��x"H��I�����u�L��H)�H��~ ��u��t�I�����f.��M��tM�1���t[]�@M��tI��ø[]�ff.�AUI��1�ATA��UH��SH��H��L�D$���tH��H��[]A\A]�@H�t$L���D��H��H��I��E1�H���L��H��H��[]A\A]�&#%3.3d;lt<gt>amp&ETH�eth�0123456789abcdef��������������������������������1���PPWww����������������������������������������������������������������������������������������������������������������������������������quot"Auml�Euml�Iuml�Ouml�Uuml�auml�euml�iuml�ouml�uuml�yuml�Acirc�Aring�AElig�Ecirc�Icirc�Ocirc�Ucirc�THORN�szlig�acirc�aring�aelig�ecirc�icirc�ocirc�ucirc�thorn�Agrave�Aacute�Atilde�Ccedil�Egrave�Eacute�Igrave�Iacute�Ntilde�Ograve�Oacute�Otilde�Oslash�Ugrave�Uacute�Yacute�agrave�aacute�atilde�ccedil�egrave�eacute�igrave�iacute�ntilde�ograve�oacute�otilde�oslash�ugrave�uacute�yacute�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�00�A�C�D {
DAHGDAHd�B�B�B �B(�A0�A8�Dp;
8C0A(B BBBKh��B�J�H �G(�K0�GHFPFHA@aHHP\HA@D
0D(A BBBAD0F(A BBB,YP��
EH
HH�X�0L�A�C�D e
DAFGDAX��K�B�E �D(�D0��
(A BBBEa
(F BBBAb�����<�nB�H�J �G0R
 DABDn DAB$yP��
HkE�X�0D�A�C�D �
DADGDA|x�K�E�E �E(�G0�D8�GP�
8C0A(B BBBDh������XP������K
8F0A(B BBBF<�nB�H�J �G0R
 DABDn DABd8�B�B�B �B(�A0�A8�Dp
8F0A(B BBBA{
8C0A(B BBBD0�aA�M�G0R
DADkDAX�R�B�A �D(�{
 FBBB�
 CBBFX����X(����<0nB�H�J �G0R
 DABDn DABp�0�gG�A�A �v
AEKP���`�B�B�B �B(�A0�A8�D`�
8A0A(B BBBCd8F0A(B BBB<kB�G�G �K(�D0�F@z0D(A BBB0\RJ�M�AE��R��FAH�mB�G�D �D(�G@R
(D ABBEk(D ABB���8	
(9 �KV��gu|���PY����@���	n�`
y���
��,�n?��S[�ap`�pn�����g�� k��R��mtest_char_tablec2x_tableentlist.4073apr_escape_shellapr_pescape_shellapr_pallocapr_unescape_url__ctype_b_locstrchrapr_punescape_urlapr_escape_path_segmentapr_pescape_path_segmentapr_escape_pathapr_pescape_pathapr_escape_urlencodedapr_pescape_urlencodedapr_escape_entityapr_snprintfapr_pescape_entityapr_unescape_entitystrncmpapr_punescape_entityapr_escape_echoapr_pescape_echoapr_escape_hexapr_pescape_hexapr_unescape_hexapr_punescape_hexapr_escape_ldapapr_pescape_ldapx���c�����������
��������c��������`����������������������������������|����������������������������������������0��������������������������	��������2	���������	�
��������1
��������K
���������
��
��
�j�/�X��������o����������
�
��L��
���������K
Y�����������������������������������
�T��������
�Z�����������������b����������������)��������@������������M������ ������������������ ���������'�����������"�����������������,��������t��������K$��������\��������w$������������)�<�e�r�&��������1��������H&���������
��� �
(�
0�8�@�H�P�X�`�h�p�x����������������������h
���
���� (08@HPX`hpx��������p��p�0��p�P���`���� �(�0�8�@�H�P�X�`�h�p�x������������������������������������� �(�0�8�@�H�P�X�`�h�p�x������������������������������������� �(�0�8�@�H�P�X�`�h�p�x��	���@�� 4 h��� PP��@��	 `
H�|���<����`4pt����  `���.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.rodata.rodata.str1.8.comment.note.GNU-stack.rela.eh_frame @]@�1�
&�,�12�E�� @@�9�

M2�$�\0)&.eW&zX&�u@�G
0,�
	�/��I�apr_getpass.o/  1747905038  1000  135   100644  1648      `
ELF>p@@ATI��UH��S�H��tDH��H���H�UH��L��H9���H������$H��1�H�����[]A\�@�[��]A\�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�4dB�D�D �F
ABEFCBd!-apr_password_getgetpassstrlenapr_cpystrnmemset��������	��������/
��������9	��������I�������� .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @d@�x	&�,�10�.:�O�PJ@�	( 
	H4Yapr_cpystrn.o/  1747905038  1000  135   100644  3000      `
ELF>�@@H��H��t.H�L�H9�s$����u�����tH��H��H9�u����DH��t�f�H���ff.��AWAVAUI��ATUSH��H��(�H�T$< uH���< t�<	t�H��A�I��fDD�T$��tX<"��<'��H��1�f.��qH�Q<\�P���< ��<	����H�ф�u�A�B�D$Hct$H�|$I��H���I�EA����H��E�w�J�<�E1�H�|$D��� u�H����� t�	t�H�K��"�I��1���'uH�SI�̾H��A�$����L���$����`�� tJ��	tE�QH�ل�t6H�Y��\u��y@��'�,H���"H�QH��H���QH�ل�u�H��H��H�|$N�<0L)�H��H�$�H�$I�I�EJ�<0H��tL������I�EJ�<0�H����u �FfDH��H��H���B��AH����t(H�O<\u��G��tH���B��AH����u�D�L9t$�	I�EI�����D<'�8���@�� t
@��	�H���< t�<	t�A��������������u�<"���f����������u3��"���������D@��'w�I��s��AH�Q������'�i������f���BH�J���[������fDI�̾H�KA�$������H���f�����붋D$�P�I�EH��H�H��(1�[]A\A]A^A_É�����S�/H���H�xH��H��[HE��f�ATI��US���t3H���f.�H���DQ uA�$I��H���]��u�L��[]A�$A\�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�;0HD}B�B�B �E(�A0�A8�G`U
8C0A(B BBBA�A�X,�NB�D�A �~AG;@ `}5@�V^Nrapr_cpystrn.part.0apr_cpystrnapr_tokenize_to_argvapr_pallocapr_filepath_name_getstrrchrapr_collapse_spaces__ctype_b_loc
��������
������������������������� 4@H`���.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @N@�`	&�,�10�.:�O��J@�x	�h
	�XYapr_cstr.o/     1747905038  1000  135   100644  6240      `
ELF> @@
�F��~HATI��UH��S1��H��9]~'H�E1�L��H�<����u�[�]A\��[1�]A\�1��ff.��F��~HAT��UH��SH�^L�d��
@H��L9�tH�;H�����u�[�]A\�fD[1�]A\�1��ff.�USH��H��t}H��txH�H��tE���tQ�uK�8�u@H���8�t���tIH��H�����H��tF�H��H�EH��H��[]�f�H��H��H��1�[]�D1�H��H��[]�@H���H�H�E��AVI��L��AUA��ATI��USH���H�t$L��H�D$�H����H���H�t$L���H��H��tsE��u�;t�L���H���@�H�(�
fDH����DE u�H���H�D�H9�v�fDH��H9�w
��DU u��@��H��[]A\A]A^�ff.�AVA�ֺAUI���ATI��H��UH��S�I��D��L��H��L��H���H��[]A\A]A^���1���u�]D��
t;��H�τ�t'�wH�O��
u���@��
u��WH�OH�τ�u��f.�����@��
u��WH�O������H������)�u;���t2f.���H��I����	��)�uE��u���H��t[��I����	��)�u@E��t;��-f��D�H��G��I����D)�uE��tH9�u�1��ff.�f�AWE��AVI��AUI��ATI��USH��H���D��H�t$H���H����U��t3H�L$H9�tC�;t>�9u9��"tTL9���L9����u4H��x/I�1�H����[]A\A]A^A_�f����f��"��f�H��������H�H���v��ff.�A�
H�����1�����ff.��S1�H��A�
�����H��H�|$���uH�T$�H��[�AWE��AVI��AUI��ATI��USH��H���D��H�t$H���H����U��t(H�L$H9�t3�;t.�9u)��"t4L9�|GL9�BI�1�H����[]A\A]A^A_�@���f�H��������H�H���v����"뼐H��������A�
H���1����SA�
H������H���H��H�|$���uH�T$�H��[�ff.�ATI��USH��H���L��H��H��H���H��HD�[]A\�	

 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�8RI�D�D �g
FBHACBA���8XRI�D�D �h
FBGACBA���@��A�A�D [
DAJD
IAJF
DAE<��B�H�E �D(�A0�D@�0A(A BBB8IB�J�J �G(�D0�`(A BBBTihY|cH��B�E�E �E(�D0�A8�GP]
8C0A(B BBBJ��0A�T YAH�B�E�E �E(�D0�A8�GPR
8C0A(B BBBE\p5A�Y YA(�6B�D�A �kAB
R#/`RCJ��\cnup�����PI���i�Y�pc
�� 1>�O�0^�p���5�6�ucharmapapr_cstr_match_glob_listapr_fnmatchapr_cstr_match_liststrcmpapr_cstr_tokenizestrchrapr_strtokstrlenapr_cstr_split_appendapr_pstrdupapr_array_push__ctype_b_locapr_cstr_splitapr_array_makeapr_cstr_count_newlinesapr_cstr_casecmpapr_cstr_casecmpnapr_cstr_strtoui64__errno_locationapr_strtoi64apr_cstr_atoui64apr_cstr_atouiapr_cstr_strtoi64apr_cstr_atoi64apr_cstr_atoiapr_cstr_skip_prefixstrncmp/
�����������������	��������\������������������
���������
����������������������������������r�����������������%S[��������������������������������������7�������������������������/#��������?�������� \`���pPX�l�p������`�t��.symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @F@��
&�,�1� 90�.B�W��R@Ph
�`		���aapr_fnmatch.o/  1747905038  1000  135   100644  5656      `
ELF>�@@
AWA��A��AVAUATI��UH��SH��h�A��A�À�*�����tnH�D$E1�E1҄���A���E������\��]</����/���]I��H���A�$E�߄�t	E��t_</u[����H��h[��]A\A]A^A_�A�$E��D�L$E��M��D�\$+����E��t��/�[�����\uA��u
�}/�F���H��h�[]A\A]A^A_�fDH�D$E1�E1�D�ȃ��D$A���UD�L$ L�T$D�\$E�����/L���D�\$L�T$H��I��D�L$ ��D��D�L$L��E���D�\$+E�����D$�����E��M��I��M9�������*t	M9������E��t��/���\u�|$�7E1ɀ�*t��?u3f���*�'M9������I��H���]��*t݀�?t�E���oIc�D��M��M��H�D$ �D$���D$,M9��„���������*��E�<$��t#��/��A��/����\u�|$�s��[����?����\u$�|$tD�E��tH����f.�D8����D$,���D�T$@D�L$8�L$0�I��H��L$0H�D�L$8D�T$@�DPu�Dp��D�T$HD�L$D�L$@H�T$8H�t$0�H�t$0H�T$8H�D�L$DD�T$H��9��L$@��E������������1�fD����H��I����ul�]���A�<$.�������.����\�Q���A���G����}.�=���H��I���]�i���fDE��t���u�f.�E������H�D$ I��L�I9���H�l$M���]�����A�����DL���D�\$L�T$M�D�L$ �+�����]E����������fD�}L�E@��!��@��^����b@��]��@�������@��\u�|$����t
A�8/�����A�x@��-��E�E8�D�\$0��D�\$,E����D�T$\D�L$X�L$T@�|$PL�D$H�t$D�T$@�I��L�\$0�T$@H��t$DH�L$8L�D$H�|$P�DHD�L$X�L$TD�T$\uB�DXtgD�T$\D�L$X�L$T@�|$PL�D$H�t$D�T$@L�\$0�H�L$8L�\$0H��t$D�T$@L�D$HB�<�9<��D��|$P�L$TD�L$XD�T$\I��@����@��]������I�hI��1����DL�E�}�����/�w���A��/�e����h����}/�IE1����fDE���������t
A��/������]I��H������������1�������]��/���H�����f.�����H���1�D�D$�>f.�</t[E��u<\�<*�|�N��H�~A��<[t]��t0H����A��E��u�<*�Q�NE��u�<\ũ�A�҄���Ic�I�I9�����M��M��H�l$I)���fD��!����I����^��<]t��tI<\u�|$��E��tA�;/t/A�C<-��I����t<]u�I�{A�K�C�����< �0������\���</� ����|$+����A���A���f��N��/�$����-���fDH�~�N����}/�����M��M��A�����A��L��M���}�������H������L�^�F�
���Hc�L�I9������H�l$M�����A�@<]�f���<\u�|$�u�L��8H�D$0@���)���@��/u�|$+����E�E8�	D8����|$,D�D$8@�|$X��D�T$TD�L$P�L$H�t$D�T$@�M��L�D$8�T$@H��t$D�L$HD�L$PL�D$8B�DXD�T$T�|$XuB�D@uL��B�D@teD�T$\D�L$X�L$T�t$PL�\$H�T$@@�|$D�H�L$8L�\$HH��T$@�t$PD�L$XF��D;�D�T$\�L$T|H�|$DD;��N�H�D$0L�@�x����A�x�
���I�����1����E���/���</�'�������E��D�L$E��M��D�\$+A�$��u����f�E�{A��]�o���A��\u�|$um�L�D�E���o���A��/u�|$+�^���L�X�@�3���A�{�F���I������E1����E��D�L$E�ֻ\M��D�\$+�g�����1�����f����tY1�<[t&~1<\t=<]u	��u-D�GH�W��t4H��<[uڃ����<*t<?uظ�f��H�GtH���1��ff.�f�AWAVI���/AUATI��UH��SH���H��H����H��H��L��H)�H�k�I�ź1�L���L��L��H�|$I��A�Ņ�t�=DH�\$x1�H��H�����t:H�T$�H�|$���t�H�|$�H�ĘD��[]A\A]A^A_�I�>�H��L��I���I��D�\H���H��H���/���A��<���.GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�d�
B�H�B �B(�D0�D8�D��
8A0D(B BBBAH
8F0A(B BBBG�cH�B�B�J �B(�D0�D8�G��
8D0A(B BBBD�

"6=�
cN]et�����apr_fnmatchstrchr__ctype_b_loc__ctype_tolower_locstrlenapr_fnmatch_testapr_match_globstrrchrapr_pstrmemdupapr_array_makeapr_dir_openapr_dir_readapr_dir_closeapr_array_pushapr_pstrdup\	���������
��������,��������4��������
������������������
��������U	��������0��������Q��������c��������v�������������������������������������������������������������
 ��
�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @@`�
&\,\12\@0^.I�^��Y@(H
p
(	��phapr_snprintf.o/ 1747905038  1000  135   100644  19136     `
ELF>�F@@I��A���A��A����Xty�����A�H9�v1Ic�L��H��H��H!�A�
���H��H��u�I)�M��fDA�L�������H��D!���A����u�I)�M��f������A�H9�w�A���������f.�AWf�AVAUI��ATA�NUSL��H��8��NDN�f/�L$�=�H�|$ �f��D$�D$ f.�zu}�t$f�f/����E1��Y��T$�f/�f(��t$(w��f(��D$A���Y�f/�w��D$(H���L$�@�H�kPE1�I���T$H�|$ �^D$I��A����D$(�X�YD$�,���0A�A��Pt�D$ f��f.�z�u�L9��YL)�1��f�A��H��H9�u�H�,IcԋL$Ic�L�4L��LD�I9��E�}L�cPL9�wTL9�sO�=�|$�f�I9�t1�D$�YD$H�|$(H����,D$(�D$��0�E�I9�s�M9���A��HL��A�@��9~�0H9�v;�p�H���N���9�A�H��8H��[]A\A]A^A_�H��E1��"���D�T$�1A�E��u
I9�vA�0I����fD�fW���DA��E�e��@�CO�f�H�����������I��H9�wK@��tE�H��A������@�׉�H��A��G0��D��E�D)Ȉ��	w�H)�H��I��@��A�����H�L9�ve��ueH��I��H��?I��H���LI�I���������H���@I��L��H��I��A�A0H���<��)��I��	w�H)�H��I��f.���t��@���������1�)��$���ff.�AWE1�AVI��AUATE1�UM��SH���L�L�^H��$�H�|$�L��H�L$(I��M��H�D$x�D$LH�D$8�D$H�t$P�NDH��t4L9�r(L�$L��H�D$I�.��L�$����I�.M�fA��EH���D$L���CL�K����<%u�I�YL�$�L�$H�I��A�IH��DJ���D$E1�E1��$�D$0�D$  �D$H<lt+<qt'�<hu
�C�H��<xw��$��C1�H��<xv��D$n%1�L�l$n�D$oH�D$x�$�D$  �01�E1�E1۾ ��#@<+t$<#t0< t<<0uH�0H���<-u�1���A����A�������f��L$H��@�t$ �|$0�DJ�
�D$<*�N�$<.����SI�
H��DQ����*��H���$H�D$8�����D$�����D$H���[]A\A]A^A_�I���+����D$n%H�D$x1�L�l$n�$�D$  ��|$�|$H��H�D$xL9����|$ 0������H��t2L9�rI�.L��H�D$�Ѕ��j���I�.M�fA�EH���E�H�D$xH���T$I��I��H�D$x��D�H�\$L���\$ L�d$L�l$0M��A��f�H��t&H9�rI�mL��A�ԅ������I�mI�u�]H��A�FD)�I��L9|$xr�H�\$�D$M��I��L�l$0��<$���D$H���D$���L9|$x���A�WH�$�\$ L��L�l$D�l$A��DH��t(H9�rI�.L��H�D$�Ѕ��Y���I�.I�v�]H��C�,D)�I��L9|$xr�H�$I��L�l$�D$�m���H�t$(���/�3�ƒ�HV���D$n�)���H�t$(�������/���ǃ�H~��H�?L�D$x�H��$�D�\$0���D�\$0I�ŋ$�����D$L���E����A�E�0I���$A�EH�D$x1����D�,$E���*
H�D$8H���!A��D�P�H�|$(�W����*
�Ѓ�HG�W��D��D�$L��$�H�T$tD�T$XH��$�D�L$@����D�\$tD�L$@D�T$XE��D�$�#H��$�Ƅ$�-H��$�H�|$@E���
IcҀ<0�r
H�t�D��D)��H���~0�T
A��A9�u鋴$����N
��)׃���D�F�L�iD��$��8�A.@�9��~0D�R�1�I�zH�<$�	fDH���|@�|H�zI9�u�L,$A�EeI�}E���
A�E+H�OA��c�%
D�����Q���D�����)Ѓ�0�D�����QH�yD���H����D�����)к����k�d)Ɖ������0�A�D���gfff���D�����)Ѝ��A)�A�@0�<.��
���$���-�_H�L$@D�L$\D�\$XH��H��H�$�D�L$\�+H�$I��D�\$XE��u
�T$0�ڃ� L�l$xE��t'H�Ͼ.�T$0H�$�H�$�T$0H�����;G��
�����Q�L�i�H�D$x�$����H�t$(�F=����ƒ�HV�F�f.���f(�fT
f.
��D�,$�E��D�+HE|$8�<$A��f�����H�t$tD�L$\L��$�H�T$pD�\$XL�T$@�
�L�T$@D�\$X�H��D�L$\I��DH��$H�F��$�����E����H��$�H�L$@H��$��V��tH��H���Q����u�A��f���D$tD�)D�P�D�T$tE����D��L��$�A��������D1�)���։�I��A��F0���<��)�A���	w�H�T$PA��A��A��+L)�D�QH����H��H�r�H��t L�V1��	A�DH���H�zH9�u�L�H�D$@�-H��H)��D$pH�L$x����H�L$@H�����H�t$(�����	��/�?�ǃ�H~�H�?L�D$xH�T$p�H��$��%����$I�Ņ��"
�$1����H�|$(���/���ƒ�HW�L�*M�����$���yL����$1�H�D$x�D$  �g����CL�K<I�%�<m�$�k<p�]<t�cH�|$(���/��H�t$(H�FH�PH�VH�H���H������L��$�H9��WH��I����H����A�Uu�H��$�L)�H�D$x�$���	�Qf�H�t$(�������/��ǃ�H~��H�?L�D$x�H��$�D�\$0�K�D�\$0I�ŋ$���	E�������A�}0��A�E�01�I��H�D$xD�$�*���H�|$(������/��
�ƒ�HW�H�HcT$H�1��$���H�t$(�������/�H�L$(H�yH�GH�AH�?H�T$pL�D$x1�H��$�D�L$@���$D�L$@I�Ņ���D$p����E���
�D$0�������� �fDH�L$xH���T����t$L�H�$L��L�|$M��I�σ���@H��t-H9�rI�.L��H�D$�Ѕ�����I�.I�VA�EH���E���D)�D�I��M9�u�L�|$H�$I�ԉD$����<S��<T��H�t$(���/�H�L$(H�AH�PH�QH�H����H�8�L�D$xH��$�H��$�L�L$ ���4$L�L$ I�Ņ���H�D$8H9D$x��H�D$xL��1��D$  �=���D<A��
���VI�.���<Bt<F�BH�L$(�<B��<F�)��/�
H�L$(�Ѓ��HAH�H����H�8H��$�L�$�H��I���L�$H�D$xL���$1��D$  ��D���sH�KA��0Mc�H��Drt$��K�4�H����0H�L�<p�1H��Dru�H���D$��H�|$(���/�$�ƒ�HW�Lc:H�S�CE���*H���D$�s�T$�}���/������/��	H�t$(�ƒ��HVH��t$�$1҉0��H�|$(H�WH�BH�GL�*M�������$1�A�H�D$x�D$  �~�H�|$(A�A�H�D$8�W�������H�|$(H�GH�PH�W����H�|$(H�WH�BH�G�F���H�t$(H�VH�BH�F���H�t$(H�VH�BH�FLc:H�S�CE������A��H���D$Mc��D$H�;�ǃ�H~����H�L$(H�yH�GH�A���H�L$(H�yH�GH�A�q�H�t$(H�~H�GH�F����$�D�����������GD�F�L�iD��$��8�A.@�9��������AeH�yA�A�E-H�OA)�D��$�A��c����A��	�(���H�����f�H��$�H��$�H�|$@���-L��I��������$����$1�A�H�D$x��������A
��/�-H�|$(�ƒ��HW��D$L��;X�HEȋD$LL��$�f.���I�������A�Uu�H��$�L)�H�D$x�$���1�H�t$8��H�FH=HB�H;T$x��@I��A�E0H�D$xH��H�D$xH9�r����������*��/�1H�L$(�ƒ��HQ��D$L��;X�HEȋD$LL��$�f���I�������A�Uu�H��$�L)�H�D$x�$�������H�|$8��H�GH=HB�H;T$x����@I��A�E0H�D$xH��H�D$xH9�r������� ������/�wH�|$(H�WH�BH�G�
��L��$��������D$p���1�)��
��щ�I����A0���<��)�A�E��	w�H��$��$L)�H�D$x�����H�L$8��H�AH=HB�H;T$x�����f�I��A�E0H�D$xH��H�D$xH9�r�������
����
��/�tH�L$(H�QH�BH�A�
�D$pL��$�������f.��щ�I����A0���<��)�A�E��	w�H��$��$L)�H�D$x������H�t$8��H�FH=HB�H;T$x���f�I��A�E0H�D$xH��H�D$xH9�r�1��]��ҍ2H�|H��H���@�0H9�u�2H�TH�L�.E�����A���$���-�JL�l$@D�$I��L���D�$E���H�D$x�+L��;G���H�Ͼe�T$0H�$�H�$�T$0H���������sH�S��0Hc�H��H�|$8�Dq��H��f�H�����:H�4���0H�H�4pH���Dyu�H�t$8H���$��� L��H�Ͼe�T$0H�$�H�$�T$0H������E������	D�B����1D��H��D9�t H��D�P�D�9�u���A.H��D9�u�9��g����A���H�|$(���/�y�Ѓ�HG��0��$��IH��Hc�H�D$8����E1�A�H�D$8����+�w���H�|$(H�WH�BH�G�;���H�L$@D�\$X�T$0H��H��H�$�H�$�T$0I��D�\$X��H�D$xH�L$8H��t(A�U��t!��H��A�T���tH�D$xH9�u�1��D$  �����/��H�t$(H�VH�BH�F��D�$1������$���-�!H�L$@D�L$XH��H��H�$�D�L$XH�$I��E����	L�l$x�+��I�EB�).H�D$xB�D)��H�t$(H�FH�PH�V�|�����/�3H�|$(H�WH�BH�G�����/��H�L$(H�QH�BH�A�2�����/��H�t$(H�VH�BH�F�����/��H�|$(H�WH�BH�G�#���H�|$(�ƒ�HW����H�t$(H�VH�BH�F����H�t$(�ƒ�HV����H�L$(H�QH�BH�A����H�|$(H�WH�BH�G�`���H�L$(�ƒ�HQ���H�t$(�ƒ�HV����H�|$(�ƒ�HW�����H�|$(�ƒ�HW��4���H�t$(�ƒ�HV�����L�l$@�$I��L���L���$H�D$x����Ѓ�HF�����I��������A�Uu���Ѓ�HG��V�H�L$@�T$0H��H��H�$�H�$�T$0I��H�D$x���H��$�Ƅ$�.H�L$@H��$�����/�D�Ѓ�HA�H�H�����8��L��1��D$  A�H�D$x�$���H��H��D�L$XH�4$�H��$�H�4$H�|$@H�PH��$�H�D$x��D$pD�L$XE�����D$0����L�l$@�$1�I���W���/�qH�|$(�ƒ��HWH��t$�$1�f�0�%�H�|$(���/�b�Ѓ�HG�H�H������H��$��8��L�$H�����H�t$(���/���Ѓ�HF�H������L��$�H9�v0H��I����H����A�Uu�H��$�L)�H�D$x����I��������A�Uu���H�t$(���/��Ѓ�HF�H�H���L����L��$�A�����������I���I�p�A��A0���<��)�A�@���	w�I���F�.��A��������I���I�p�A��A0���<��)�A�@���	w܉�I���F�.A�����������I���I�p�A��A0���<��)�A�@���	w�M�h��F�.���������Ӊ�I����C0���4��)�A�E��	w�H��$�L)�H9D$8������$�����H�D$8���H�|$(���/�Y�Ѓ�HG�L�(M������A�uH��$�A��������H�ˉ�H�K�A��F0���<��)��C���	w��A�:H��$�Icu(L��H��L�L$0H�L$ H�D$@�H�L$ L�L$0���HH�T$@L�C��2H����������!�%����t������D�H�rHD։�@�H��H+T$@A�}
�E�UHE��uA�}L��uA�}P����I)��A�]��M�h�A�E[I�u���W�������(�H�D$@������H�D$@�D�f�D���H�D$xH�|$(���/���L���$1҉A�����/��H�t$(�ƒ��HV��D$L����/�H�L$(�ƒ��HQ�
�T�����/�YH�L$(�ƒ��HQ��D$L���/��H�|$(�ƒ��HW�
�6��$1�A�H�D$x���1�H�T$pH�t$tD�L$\L��$�D�\$XL�T$@�j��L�T$@D�\$X�D�L$\I��DJ�����L$t���!D�A�H��$�1�D�Q�L��D�D$tH��$�H�|$@�H���<@�<D��)׉|$tH�zI9�u�Hc��<$H�VH�Hх��dE���[����$�����80�����.H������f��+0�A0H��f�A����+����T$0�����;GH�D$x�����L�� ��H�t$(H�FH�PH�V���H�|$(H�GH�PH�W���H�D$(L��1�A��$H�@�|�H�L$(H�QH�BH�A�O���L�����H�t$(H�VH�BH�F���H�t$(H�FH�PH�V���H�L$(H�AH�PH�Q�Y����80t�.H��H���A�0��u�DŽ$����H�t$(H�VH�BH�F���H�L$(H�QH�BH�A���H�|$(H�WH�BH�G�/����D$0����L�l$x� �C��A01�H��� �� �X�D�$Ƅ$�0E�����QƄ$�.�T$t����H��$���H�|$@H�tH��$�H���A�0H9�u��H�|$@�D$t��H�L����H�D$x1�L�����1��$�H���$�Q��L�l$x1���H�|$@�.H�L7���H�L$(H�AH�PH�Q���H�\$@I�}	H��H�I�E��H�L�H�L�H��H��H)��H)���H���E���YH��$�Ƅ$�.H��$�H�t$@����L�k�H��$��A�?L)�H�D$x�p�I)Љ�M�Ń�sm�������B�H�|$@�A���/�H�L$@�T�fA�T���@H�t$(H�FH�PH�V�����/wLH�t$(�Ѓ�HF����H�t$@I�xH��H�I���H�L�I�L�L��H)�H)������H���H�|$(H�GH�PH�W��H��$�H��$�H�t$@����H�L$@�A��T�A�T��g�H�|$@���D��D��Q�I���J�H��$�H��$�H�|$@����ff.�SH��H���H�L$HL�D$PL�L$X��t:)D$`)L$p)�$�)�$�)�$�)�$�)�$�)�$�H��ucH��$�H�L$H��H�D$ H�D$0H�$H�D$�D$�D$0H�D$(������D�H���[��H�D�H�<$H�L$H��H�D$H��$��H�D$ H�D$0�D$�D$0H�D$(�H�$��SH��H��H��u3H����H�$H�D$����D�H��[�fDH�D7�H�<$H����H�D$�H�$���D��H��[�bogus %pnaninf0123456789abcdef0123456789ABCDEF0123456789abcdef0123456789ABCDEF(null)��������$@���Q��?�?�������GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx��0HD�B�F�B �E(�G0�A8�Gp	
8D0A(B BBBD��L��#B�E�E �B(�D0�D8�G�^
8A0A(B BBBA �A�J��
AH(qA�G p
AGoA��0�C0V�e��mp�zA�	�	�	���		
��p�#�������0(@)qconv_p2_quadlow_digits.10400low_digits.10386upper_digits.10401upper_digits.10387snprintf_flushapr_cvtconv_10_quadnull_string.LC2.LC4.LC3.LC1.LC8.LC9modfapr_vformatter__ctype_b_locstrlenstrchrapr_strfsizememcpyapr_strerrorapr_sockaddr_ip_getbufapr_snprintfapr_vsnprintf
�Z
�
��
0���������3
��������H���������
��������������������������[
�����������������:��������>���������������������������S��������[�����������������D�Z��������e���������
AEAf


�
�
0{
�
0��������T�����������������������������������e������������������<
Ae��������� ��������9!�����������s!"��������|"

#

	�$

�(
��(��������)
�3)��������Q)
�j)���������)
��)������������ �(�0�8�@�H�P�X�`�h�p�x������������������������������������� �(�0�8�@�H�P�X�`�h�p�x������������������������������������� �(0�8k	@�H�P�X�`�h�p�x������������������������������������� 2(08k	@�H2P�X�`�h�p�xp�������g���	������ 4�H��p�p�0(@).symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.rodata.rodata.cst16.rodata.cst8.comment.note.GNU-stack.rela.eh_frame @�)@�4@&�),�)12�)E*H@@�9XM`. [�. h0�..q�.��.@�@HE�0x	�3'�E�apr_strings.o/  1747905038  1000  135   100644  5168      `
ELF>�@@
H��tKATI��UH��1�SH��H���L��H��H)�H��HE�H�s�H��H��H����[]A\�@1�H���f.�H��t3UH��H�rSH��H���H��H��H����H��[]�D1�H���f�H��t+UH��SH��H��H���H��H��H���H��[]�f�1�H���f.�H��t+UH��H��SH��H���H��H��H��[H�P]�D1��ff.�f�AVAUATE1�UH��S1�H�ĀH��$�H�t$XH�D$H�D$PH�T$`H�L$hL�D$pL�L$x�D$H�D$�5f���H�L$P��HʉD$H�:H��t9�A��Ic�A��H�D� HËD$��/v�H�T$H�:H�BH�D$H��u�H�sH��1���D$I��H��$�H�D$H�D$PL��H�D$�@f���HT$��L�*�D$M��t@��UHcŃ�L�t� H��L��L��L���D$��/v�H�T$L�*H�BH�D$M��u��H��L��[]A\A]A^��L���I���ATUSH��toH��H��H��E1�H���LBH��H��u�I�pH��tL��I��L��H�3H�SH��H���H�K�H�H��u��L��[]A\�DH��tH���H��I���L��[]A\ÐAVA��AUI��ATI��UH��S�D��L��L���H���H�E�[]A\A]A^ÐATA��UH��SH���D��H��H���[]A\�fDSH���H�ߺ
1��[��S���E1�H�H
��y��A��@
������DH���H�q�������)Ã�0�Y��Ӆ�u�E��t�F�-H�q�H��[�ff.�f�SH���E1�H�HH��y	H��A�H����������@�DH��H��H�q�H��H��H��H�H)Ã�0�Y�H��H��u�E��t�F�-H�q�H��[�ff.�f��{���ff.�S�PEH��H���D$	KMGTf�D$
�D$H���0��H���~uH��H��
H�������A�KH��~H��	���������=�_��	A��1���H�����x&H��H��[���1���H�����y��****H���CH��[�H��E1���H�t$	H��H�FH��
H���o�ω�D�NH�с��;����%E�ȺH�߃��H��1�����w���H��H��[�@�  - H���FH��[�DH��H���r���%3d %d.%d%c%3d%cGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�,VG�D�F �wABE���(L>F�H�G [AAF��(x6F�D�J WAAC��(�3F�G�G IG�E�D�]B�B�B �D(�D0�F�)
0D(A BBBH4�B�A�A �k
ABFcAB8P?B�E�E �D(�D0�c(A BBB(�*B�D�D �XAB�A�Y�cA�a�sA�q@ {A�L �
DDk
ADw
DEQ
AFV '`>6�6B�3NU ]a��n ?z��`*����c� s����{�apr_pstrndupmemchrapr_pallocmemcpyapr_pstrmemdupapr_pmemdupapr_pstrdupstrlenapr_pstrcatapr_pstrcatvapr_strtoff__errno_locationstrtolapr_strtoi64apr_atoi64apr_itoaapr_ltoaapr_off_t_toaapr_strfsizeapr_snprintf	��������1
��������?��������v
������������������
������������������������������������
��������3��������t���������
�����������������

��������5��������L��������n������������������
��������*
��������7
D��������]
j���������

��������������������������� P`|���� �T �`����� �$�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @+@��
&k,k12k@0~.I�^�`Y@P8
	�	���hapr_strnatcmp.o/1747905038  1000  135   100644  2360      `
ELF>8@@AWI��AVAUATU1�S1�H��(H�|$�T$�L�T$L��L� M���Hc�Hc�A����A�D���H��C�<lf�� u�D��G�tfA�� t'��Hc�fDD�4��H��G�tL��fA�� u�f���
fA����Hc�L�Hc�L�H�D$�A�<DI��A�I��A�Df��f%��0�#��0�f���nf��t}�L$H�L$A�1��T$L��@E8����������D�B�<F�I��A�<|M��f��C�D\u#�T$�L$f��tC�����H��([]A\A]A^A_�I��f��u��H��([]A\A]A^A_�E�u��T$�L$��u�D������D$��tH�t$�H�t$H�B��B��8�|�������A���f�~����D��*����f��tXf���c���E8��=����T����T$L��L�\$�f.��:E�;I��A�DM��f%C�DTu �T$f���������:���1�����f����E8�����H��E8�~������ff.�1��9���f���&���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�`�B�E�B �B(�A0�C8�F``
8A0A(B BBBAR
8A0A(B BBBD��
�.�<�
strnatcmp0__ctype_b_loc__ctype_toupper_locapr_strnatcmpapr_strnatcasecmp���������	�������� ����.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@`0	&,10.:HOH�J@�H	� 
	N�Yapr_strtok.o/   1747905038  1000  135   100644  1576      `
ELF>(@@AUI��ATI��UH��SH��H�����u@��u�qf��uH��@��t\L��H�]�H��u�I�]�u@��u�)@H��I�]�3@��tL���H��t��I�EH��H��[]A\A]�DH��1�[H��]A\A]��H�*�d���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�L�B�E�D �D(�D0v
(D ABBFD
(C DBBI�apr_strtokstrchrD��������t�������� .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�0	&�,�10�.:&O(hJ@�	��
	h�Yapr_hash.o/     1747905038  1000  135   100644  6136      `
ELF>�@@L�I���t'J���M��tT@��H������W��H9�u�Ð���t2I��fD��I�������A�„�u�I)���L���É�E1���AWI��AVI��AUATUSH��H�G@H�T$H�$H����H�t$L����A��I�GD��A#W4H�,�H�]H��tQL�l$�f.�H��H�H��t5D9cu�L9ku�H�{L��L�����u�H��H��[]A\A]A^A_�@H�<$t�I�GHH��tPH�I�WHH�T$H�$H�D�`L�pH�PH�H H�EA�G0�fD�W8H�t$L�����A���7���I�?�(�먐S�^H��H���H��1�[H���f�UH��SH���H��PH�D$�H�T$H��H��H�(H�@HH�H�C0H��H�� 1�H�T$1�1�1؃��C8�x���H�C@H�CH��H��[]�f�SH���H�X@[ÐH�GH�GH��u,H��W�q49�r)L�A���9�w"I�ЍJH�GH��t�OH�H�GH���@�W�@SH�FH��H��t
� ��{4H�sH�1�H�@H�@�	��9�w"�JH��H�PH��t�H��HH�P[�fD�P1�[�f�H��tH�GH�@H�H��tH�GH�@H�H��tH�GH�@ H��ff.�@H�GH�@��H�GH�@��H�GH�@ ��1����f�UH��SH��H���F4�P�F0H��H�t
H����U01�E1�H��]4L�XP�P0�U8�X4�P8H�U@H�@HH�P@�U4L�XH�m��L��PDD��I�4�H�T�H��tH���D�B��H��I��H�H�D�AL�BL�AL�BH�L�AL�B H�L�A H�6H��u�A��H�D9�s�H��[]�H��1�����H�H��tH�@ H���@ATUH��SH����H�H��t�K0H��t�C4H�j 9�r&[]A\ÐH�2��H�0H�CHH�H�SH�K0[]A\�@�lH�;�����1�H��I���H��tkL�H�P�HA�y4f���#rI�4�L�L�H�H�PH�PH��u,9�r8M�A�
���9�w"I�ȍqH�PH��t�p��H�2H�p�@�HL�c�k4[]A\�f��G0�ff.��UH��H��1�SH���H��tkH�HH�ÐH�QH�qH��1��H�KH�KH��u2H��S�A49�r7H�y�fD��9�w"H�׍rH�KH��t�sH�H�C�fD�SH��[]�fDAWI��AVI��AUATUSH��H��HH�t$ �PH�|$0H�L$(L�D$8�A�v49s4I��L�8Cs4H�@HH�C@I�D$@�C0A�t$4A�D$0A�F0C09�s	�t6A�t$4�C8H�|$0A�D$8���H�D$I�D$H�D$ �@0C0��D�S4L�KE1�E1�H�\$D��I��H��tUE�\$4I�|$fDD��H�p�HA��H��H��H�rH�pH�rH�p �JD!�H��H�r H�1H�2H�H�H��u�A��E9�s��D$D�l$H�L$ �D$H�QH��H����I�D$@H�sH�{H����ЉD$I�D$�T$A#T$4L�{L�,�H�kM�uM��u�@M�6M���|M9~u�I�~L��H�����u�H�D$(H�K H����L�L$8M�F L��H��H�|$0��I�F H�H���[���H�L$ �D$�D$9A4�'���H��HL��[]A\A]A^A_�f��D$H�t$H�S H��H��H�Ƌt$��H�hH�P I�UL�x�pH��L$I�EA�D$0�A�T$8����D$��I�N �e�����H�|$0H�4�H���H�D$����ff.�E1�1��F���fDAV1�AUATUSD�B4H�J�@��D9�wq�XH��H��t�L� H��I��I��f�H�H H�PL��H�pA�Յ�t?M��uC�M49�w.H�u����9�wH�ލSH��t�L� �����[]A\A]A^É�L��L� ���fDH��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�pH0B�E�E �B(�A0�A8�DPz
8D0A(B BBBE|A�U$�~A�D�D0oDA�A�M�L�gA�X
GF1$	8	L	`$t�A�D�G �AA�DW@��B�A�D �d
ABBX
ABE�AB�$�A�I�D yAAL4�B�E�E �B(�A0�A8�G��
8D0A(B BBBC�
<��B�D�B �A(�A0��
(A BBBA��pp�&18�~FS h0Lv�g��1�0	�@	�P	�`�p��P�p�
`p�(�7�
H��Tp	find_entryalloc_array.isra.1memcmpapr_pallocmemsetapr_hash_makeapr_time_nowapr_hash_make_customapr_hash_nextapr_hash_firstapr_hash_thisapr_hash_this_keyapr_hash_this_key_lenapr_hash_this_valapr_hashfunc_defaultapr_hash_copyapr_hash_getapr_hash_setapr_hash_countapr_hash_clearapr_hash_mergeapr_hash_overlayapr_hash_doapr_hash_pool_get�
��������y�����������������������������������%
����������������������������������������������������1���������
�������������������������� 4p����� �0���(0<@PPd`xp�P�p�`p8�����p	.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @t	@8h	&�	,�	10�	.:�	O�	�J@��	�

	�f�Yapr_skiplist.o/ 1747905038  1000  135   100644  12128     `
ELF>�+@@
�����H�H9r�����ff.��1�H9>�������F��ff.�@ATUH��SH��ttI��L�����H�xH��H��H�Hǀ�H��1�H)�������H�L���L���H�CHL�chL���H�]1�[]A\þ���H��H��u޸��f��
��w���q��5!��@H������!Љ5H���f�ATI��USH��H�GH;Gs$H�H��H��H�C1�L�$[]A\�fDH��t[H�{H�,H��H��H��tZ�H��H��tzH�CH�3H��H��tH���H��H�CH��H�H�k�fDH�{�� H��u�H�;�H��H��tH�CH�H�kH���L���D[�]A\�ff.�H���GAWAVI��AUATUH��SH��H��H�v0H��tH�~81�����H�C H��tH��H�C H��u�M��L�mPA��f�H�CH�SH�BH�CH��tH�PL�cM����E����H�;H��tA��H��L���k���H�u H�mH����H�~t�DH�~uGH�FH�E H��tH�@ L���$����EH�u ���EH��u�H�E8H�E(H�E0���D�H��[]A\A]A^A_ÐH��L������M���a���L������@1�ËE릋E�AWAVI��AUATUSH��H����H��H��I��E��H�D$E1�H�CH��tOH�0H��A�ԅ�u@H�[E��uoH��u
�P�H��H�CH��u�I�H��D��[]A\A]A^A_��.H�[A��H��u�H�\$H��u��I���H�[��f�H�\$��E1���@AUATUSH��H��H��t~I��E��H�l$H��H9t,H�G@H�l$H��tH�E1�H��H�����H�D$H��tBH�8H�OH� E��H��L������H�D$H��tH�H��t#H�H��[]A\A]�f�H��tH�H��1�[]A\A]��H�G`H��tH�WPH��H�G`H��H��tÐH���H��t�@�f.��@�fDAWI��AVAUI��ATI��USH��(�o�G�$L�D$������3����
DM�w M��t`I�GpH�D$�%@�$���%�<$�I�v�gI��M��t0I�FH��tH�0L��A�Յ�t��9���M�v��M��u�I���H����I�WpH��I���H�,�H����1�E1�L��H�$����H�$I��H�EH��I�FtL�pL�uI�nI�F I�F(I�F0I�VH���ML�r I���M�&M�~8H��t&I�WpH��I���H�,�L��H���y����A;_h�DH�j H�hI�o0I�o H�@(H�@0H�@H�@ L�pL� L�x8M����I�F A�OI�ƍQA�W9���L������L��H�����I�W H�E(H�E0H�EH�E H�EH�UH�EL�}8H���N���I�o8I�o(�E������A9_������>�����u����DH�|$L���s����3���fDI���H���I�G@H��t@H�@(H��t7H�XH��t.L��H�;I�uE1��H��K���H�[H�E0H�h(H��H��u�I�GH��(L��[]A\A]A^A_�I�G H�T$L��H�D$����I�G H;D$�|���A�oI��ILJ����]�����S��������������@��9�������8�����u�������������f.�M������ILJ�E1��+���DE1�E1����I�v���@AUATI��USH��H���H���I�D$HH��H�X�@��~&H;3tK��H��H��H��H9+t3H��H9�u�H���I��H����H��E1�[L��]A\A]�DH�SH�B�R��~(�xtS��H��H��H��	�xt:H��H9�u�H���I��H��t�H�{�L�(�@H��L��[]A\A]�L�(�@H��[]L��A\A]�I�|$H���I��$�H�(H���H��H�C�H��H��[]A\A]�ff.�H���tnH�GHH�x�@��~N�H�H��H��H�H�WH�B�R��~(H;0t5��H��H��H��
DH90tH��H9�u�H��H9�u����@�H���AUE1�I��ATI��UH��SH��H�@H��H��K���H�<$tH��[]A\A]�f�H���H�|$�����Å��H�|$L��L���H�}@H�t$H�H���E1�1����H�PH�$H��u��H��H�B��H��u�H�$H�E(H���l���H�@H�$H���[���H�|$��H�0H�H��tg@E1�1��~���H�$��~��@H�I0��u�H�$H�Q0H�P0H�Q0H��tH�B(H�H(H�A0H�AH�$H����H�|$H�0H�H��u�1�룐H�?tH�t���fDH�7H�W�UH��SH��H��(H�|$����tH�EH��([]��H�D$H��H�x@���u�H�T$H�z@H�?t,H�t%���D$�H�T$�D$��H�H�GH�UH��([]�fDE1��X����H�E1��E���DA��5���DH�A��"���f�H�G(H��tH�@�f�H�H��tH�@H�H��tH���1��ff.�f�H�H��tH�@H�H��tH���1��ff.�f�H��tH���1��ff.�f�H��tE1�1�����1��ff.�f�H�H��tE1�1��^���fD1��DH��tE1���>���fD1��DH�H��tE1������1��DI��H��H��t
��������1��DI��H�H��t
���������1��DH��u�9f�H��H�FH��u�H�F(H��tH��H�F(H��u��g��1��ff.�f�H����AVI��AUATI��UH��SH��H��L�l$H9Ot,H�@L�l$H��tH�E1�L��H���5���H�D$H��tcH�H�{ E1�H��L��L���C�H�D$H��tAH�p(H��u�VfDH��H�F(H��u�H�t$L��H����H��[]A\A]A^��H��1�[]A\A]A^�f�1��DH���H�O�����AWI��AVAUI��ATUH�oPSH��H�w(M��A��H��tL�L�fM��tE��tI�<$H��tH�t$A��H�t$@H�^ H����H��H��u�L��M��u�I�E(I�E I�E8I�E0A�EI�EH��[]A\A]A^A_�ff.�f�SH�_(H��tH�C1�H��tH��H��H��}�H��[��H�G(H��tH�@H��tH��f.�H�G�ff.��G���D��f��G�ff.�����H�w�f�ATI��USH��H�{@H�G(H��t!H�pH��tH�.����H��u�fDL��H���H���t []A\�fDH��H�SPH�C`H�<��H�C`H��u�H�{P�H�{p�H��[]A\�ff.��1��Y���f�ATI��UH��SH��H�G8H��t^H�xtWH�F(H��t0H�XH��t'DH�UH�3H��t
E1�1�H���?�H�[H��u�L��1��H�ĠH��[]A\�DH��1���Eo$�DoE�o}�ou DM�om0�oe@�EoT$�o]P�oU`�oMpDU�Eo\$ H����o��D] �Eod$0De0�Eol$@Dm@�Eot$PDuP�Eo|$`D}`�EoL$pDMp�Eo�$�D��I��$�H���E$A|$At$ I��$�H��Al$0Ad$@A\$PAT$`AL$pA�$�H�Ġ[]A\� �H�$H�%GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0,D�B�A�D �u
ABAtNla4��B�D�A �g
ABG�FB`�]K�B�E �B(�A0�D8�G@
8A0A(B BBBB`������C@������H(�B�B�E �B(�A0�A8�DPb
8D0A(B BBBHHt�B�B�A �A(�G@s
(A ABBJP(C ABB�JH��B�E�B �E(�D0�A8�D`�
8D0A(B BBBAl BB�B�D �A(�D0a
(D DBBF[
(D ABBDK
(A AEBDt(D ABB��8�OB�H�D �D(�D@Z
(A ABBJzRx�@����$ 0(�A�D�G@Z
AAHgAA\p����#�#��$8L`tCd��K�E�B �D(�D0�G@�
0A(A BBBHD0C(A BBBJ�����H@������	D�B�E�B �E(�A0�E8�DP�8A0A(B BBBL(A�fh|���4��B�D�A �G
ABGtAB@�B�D�D �G�Z
 DABF AAB @�-�N8@M0�\ ]m���P��J7P����	���3���	B&`
�38�
OO0 hnP����
�
� 
�0
�@
#�p
#�
*�
F�
Zs �@�`��C�����	����((�:�L�`�w�����indexing_compindexing_compkskiplisti_initget_b_randph.7181randseq.7182skiplist_qpushskiplisti_removeskiplisti_find_compare.isra.2skiplist_new_nodeapr_skiplist_add_index.cold.6skiplisti_destroyapr_pallocapr_array_makecallocmemcpyreallocmallocapr_skiplist_allocapr_array_pushapr_skiplist_freeapr_skiplist_add_indexapr_skiplist_set_compareabortapr_skiplist_initapr_skiplist_find_compareapr_skiplist_findapr_skiplist_last_compareapr_skiplist_lastapr_skiplist_getlistapr_skiplist_nextapr_skiplist_previousapr_skiplist_elementapr_skiplist_insert_compareapr_skiplist_insertapr_skiplist_add_compareapr_skiplist_addapr_skiplist_replace_compareapr_skiplist_replaceapr_skiplist_remove_nodeapr_skiplist_remove_compareapr_skiplist_removeapr_skiplist_remove_allapr_skiplist_popapr_skiplist_peekapr_skiplist_sizeapr_skiplist_heightapr_skiplist_preheightapr_skiplist_set_preheightapr_skiplist_destroyapr_skiplist_mergeX�����������������������������������������������������
����������������%�����������������������������������j	���������	���������	��������
��������3
��������G"���������
 �
�!���������� 4
�O6��������y ��������� ��������� �������� 6��������>6��������2��������F��������N
���������
 ��������7��������\� ��������#�������� 4 H@x��0� ,�xP��P$	�`
��
0,P`�t
�
� 
�0
�@
�p
��
�
�
(< P@d`x������P�l�����������.symtab.strtab.shstrtab.rela.text.data.bss.rela.text.unlikely.comment.note.GNU-stack.rela.eh_frame @I@�#x&�,�6�1@P'E0�.N�c�X^@h'	0�	 �p+mapr_tables.o/   1747905038  1000  135   100644  15064     `
ELF>�7@@
USH��H���W;WtH�O�B�S�CH��[]Hc�H���ҍ,��wN�H�?��Hc���S�SH�sH��Hc���k�SH��H�C�ff.�f��H��t
�W1������ff.�AVA��AUI��ATE��U��� S���L��H�øN�D��Mc�L���L��1�H���L�+H�CH��D�s�C�k[]A\A]A^�fD�G��1�H��t�W��uÐ��H�G�W�WHc�H��ff.�ATUSH���W;Wt!H�o�B�S�C[Hc�H�D]A\�fD��D�$��wDN�H�?A��Hc���S�SH�sH��H��Hc���C�{D��1�)�����Hc�Hc�H��H�k�SD�c�x���DH�t)UH��SH��H��H�H��t$�H�(H���[]�H�W��fDH�;��
�H�CH���H�SH�{H��DAVAUI��ATUH��S�V�G�wD�g�9�.H�OA��I�uD��H�Ic�H�<�[A�EE]A\A]A^Í6���N�9�~
��9��E��H�}D��Mc�L���L��1�H����UH�uH��A��Hc���]A�UH��H�E�E�i���AVAUI��ATA�UH��� S�D�uL��H�ËED����DOeA��Hc��D�s�U�C�UH��H�CH�uL�+D�cHc���}�S1��C)��{����Hc�Hc�H{�H��[]A\A]A^�f�UH��SH�� H���H�SH�(H�P�S�P�S�P�S�PH��[]�fDAUI��ATI��UH��� SH���L��H��L� H�EH��H�C�E�C�E�C�E�C�H��H��[]A\A]�f.�AWAVAUI��ATUSH���F����H�^I��H������A��1�L�<��fDA��H��H��H��tH�;H��t�H�L9�u�H�uL��1��I�\$H�D$I���DE��tE�uI��H��H��t)H�3H��t!H��H�4$�H�4$L��I��H���M���A9l$�A�EH�D$H��[]A\A]A^A_�fD�L����H�D$��f�H���ff.���H��t
�W1������ff.�ATI��U���(S���L��H�øN�tm��Hc��L�#H�CH��H�C�k�C []A\�ff.�f�AUI��ATA�UH���(SH���L��H�ËE��DOeC�4d��Hc��H�CHcUH�CH�uH��L�+H�RD�cH����E�C�oE$C$�oM4K4�oUDSD�o]T[T�oedcd�omtkt�o�����o�����o�����o�����o�����o�����o�����o�����o���o���E �C H��H��[]A\A]��G�G ÐH����AUATUSH���.�W ���������t1���N��	ʉ�������V	����t�V	Ձ�������H�WI��H��HcH$Hc��H�IH�@H��L�$�L9�v�4@H��I9�r'9ku�H�;L�����u�H�CH��[]A\A]�@H��1�[]A\A]�1��������߉��|���AWAVAUI��ATUH��SH��(D�6H�T$D��E��t7D���v����	������O�E	����t�E	�����A�փ��A�UA�u ��D��T$������I�}I�D�HcH$Hc��H�|$H�IH�@H��L�<�L9�v�@H��I9��vD9su�H�;H�����u�H�t$I�}�D$E1�H���1�D�L$H�C�I9�s7�o�M��t�oI���AL$�H�CI�D$�H��I9�rFD9su�H�;H��D�L$�T$��T$D�L$��u�A�mM��LD�H��I9�s�f.�M����HcD$H�t$H�@H��H9�v �oI��H��AD$�H�C�I�D$�H9�w�E�UI�U1�A�A�E E���fDA�u H������I�|�D����D�����u
	�D�O$A�E A��H��E9�u��Qf.�	�C�T�$A�E �D$L��C�����q���I�}H��H���H�t$I�}H��D�sH�CH��([]A\A]A^A_Å�t��1�����%����A������AWI��AVAUATUH��SH��(D�6H�T$D��E��t7D���v����	�������E	����t�E	�����A�փ��A�WA�w ��D��T$������I�I��HcH$Hc��H�|$H�IH�@H��L�$�L9�v�pDH��I9��^D9su�H�;H���A����u�H�D$H��1�E1�H�C�I9�s4�N�M��t�oI���AM�H�CI�E�H��I9�r@D9su�H�;H��D�L$�T$��T$D�L$��u�A�oM��LD�H��I9�s�@M����Lct$H�t$K�vH��H9�v&��oI��H��AE�H�C�I�E�H9�w�A�A�G 1�A�����A�W H�D$H������I�4�D����D�����u
	�D�N$A�G A��H�D$D9�u��3@	�C�T�$A�G �D$L��C�������H�t$H�(H�pD�pH��([]A\A]A^A_Å�t��O�����%����A������AW�AVAUATUSH��8D�&D�����G ��E��t9A���VD��	�A��A�������FA	�A����t�FA	�A��������H�WH�t$I��H��HcH$Hc��H�T$I��H�IH�@H��H��H9�v�bf.�H��H9��KD9cu�H�t$H�;H�L$�H�L$����u�IcGH�T$L�kI��H�@A��L��E�OL9�s*�~f��AoMI��H��K�I�E�H�C�L9�rQE9eu�H�t$I�}L�T$(H�L$ D�L$�D�L$H�L$ ��L�T$(u�A��I��E�OL9�s�f.�L�t$M9�v%fD�AoEH��I��C�I�E�H�C�M9�w�A�G 1�A�E���Bf.�A�w I������I�<�D�������u		�o$A�G ��I��A9�u�H��8[]A\A]A^A_��%����A���?���f�AWI��AVAUI��ATI��USH���.���t1���V��	Љ����� �F	����t�F	Ł����߃�A�T$ ���D$��������I�D$I��HcJ$Hc��H�IH�RH��L�4�L9�v�SH��I9�rG9ku�H�;L�����u�H�sI�<$L��E1���H�CH��[]A\A]A^A_��A�L$Lct$C����L���v�I�<$L��H���I�<$L��H���kH�CH��[]A\A]A^A_�f�A�L$Lct$	�C�L�$A�D$ ��%���߉����f�AWI��AVAUI��ATUSH���.H�T$���t1���V��	Љ�������F	����t�F	Ł����߃��A�W ��D�������I�GI��HcJ$Hc��H�IH�RH��L�$�L9�v�VfDH��I9�rG9ku�H�;L�����u�H�sI�?E1��H�L$�H�CH��[]A\A]A^A_��A�OC����L����H�t$L�(H�p�hH��[]A\A]A^A_�fDA�O	�C�L�$A�G ��%���߉������AVAUI��ATI��UH��S������I�4�����A�T$ ���u
	Љ~$A�D$ A�]��t.A�U��	Ӊ����t[A�U	����tDA�]	Á�����L���@�I�<$L��I���I�<$H��I��A�^I�F[]A\A]A^�%���߉����������ff.�f�AUATI��USH��H�^�v�I��A�D$��~(1�f�H�SH�3L���H���A9l$�H��L��[]A\A]�DATD�GI��UH��S�����H�4��D����W ���u		�D�F$�G �]��t+�U��	Ӊ����t6�U	����t �]	Á�������H�(L�`�X[]A\�%���߉������������ff.��AUI��ATI��UH���(SH���L��H��L� H�EH��H�C�E�C�E�C�E�C�D�KH�s�C E��~ME1�1�A���D�C H������H�<�D�����D��u	D	��W$�C ��H��D9�u�H��H��[]A\A]�f�AWAVI��AUI��ATUSH��8H�BH�<$H�D$(�H�t$��/���ƒ�HQ�L�:�D$$M��u$���ƒ�IVA�L�:M���<E�'A�U D�����rA���/v�I�VH�BI�F���E��t<A��A�wD��	�A��A�����/A�WA	�A����tA�WA	�A��������H�L$(M�\�IcC$H��H�@H������H��A9����L�M��t�D9cu�L��L��L�\$L�D$�L�\$��u�L�D$H�S��H��H�|$H�$L���L�\$��u��D$$����H�\$(1�f�A9m~GH�3H��t2H�SH�|$��H��H�$�Ѕ�u؉D$$�D$$H��8[]A\A]A^A_Ð��H��A9m����@�D$$�f�H�QH�BH�A�K�����������A������ff.�H���H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$�H�L$�D$H�D$H�D$ �D$0H�D$�H����fD���g�G���[AWAVAUATUSH��H��X�t$LHc�H�|$@H�?H���LcsH�SI��A�F�I�L�L��H��H�P�H��H9�u�H�D$@J�4�H�8�H�D$I����I�^�L��H��H��H��L�fDL�mL�eI�uI�<$���~L�mL�eH��H9�u�I����L�T$A�f�K�L��L��1�H�$M9���L�T$8L��M��I��H��fDI�+I9�I��MF�I9���I9���M��M��I��I��M����I��H�k�M9�tqM9��
J�,�N�4�H�L$0H��L�\$(H�uI�>L�D$ L�T$L�L$H�T$�H�T$L�L$��L�T$L�D$ L�\$(H�L$0�L��I��H�k�M9�u�M��M��M9���L��H��H�4�L��fDH�<�H�<�H��L9�u�L)�I�,L<$H��I9������L�T$8M��I��L)�H��I9�v�I��I��H��I9�w�L�$M9���L��M��I�����@��L��M��I9�s%L��H��H�4�L��H�<�H�<�H��H9�u�L)�H��I�,L<$I9��g����c���f�M�������M���1��a����L�T$H�D$@H�|$�D$Hc@L�wH��I��L9���H�$L�l$�fDM��H9,$��I��I�]M�&I�nD�{E9|$u�H�I�<$H��H�D$���u�H9,$�6I�FD;xt-�'f�H�uH94$�H�ED;x�H��H�t$H�8���t�L�}�H����@H�D$@D�@H�x�D$��tWIc�H��H�@H��H��f.�H�8t�oH��B�H�pH�r�H��H9�w�H)�H��i�UUUUA�H�D$@D�@L�\$@A�C E��~L1�1�A��
fDA�S H������M��D����A�����u
	�A�q$A�C ��H��D9�u�H��X[]A\A]A^A_��I��|$Lt>H�F�H�@H�CL���	DL�eH��I�$L9�v��D$�A���fDL��E1��H�]H�{H���M�dL9�v�H�D$@L��L��H�8�I��H���f.��, H�Xf�H�EH��H��H�p�H�E�H�x�H�L9�v��I�EL�`M�&�>����L�|$�[���fDH�D$@H�x���M��H������AUATUSH��D�oD��FuH��[]A\A]����I��H���E��tfA�D$ �s 1ɿ���s&A����Dꉔ�������uA�T�$D�T�$H��H�� u�	�C H����H��[]A\A]���f��AoD$$C$�AoL$4K4�AoT$DSD�Ao\$T[T�Aod$dcd�Aol$tkt�Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$����Ao�$��Ao�$�A�D$ �C ���SH��H��H��E1�1�H�� H�<$H��H�D$H�D$�H�D$H��tH�t$H��t
�,H���H�� [�, GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�(sA�A�G Z
AAKH8\jB�E�E �D(�H0�J(A BBB��%(��B�A�A �Z
IBG0�kH�D�G UFAA��P ��8 �B�B�E �A(�D0�s
(H BBBA8\�B�B�E �G(�I0�}(A BBB$�:A�D�L fAA4�VB�E�D �I(�D0t(D ABBH�B�B�B �E(�A0�A8�DP�
8A0A(B BBBGDX(lSB�D�H �AAB8�PB�E�G �I(�D0+(D ABB�X��K�B�A �A(�D0�
(A ABBED(C ABBA����C0����HD�B�B�B �E(�A0�D8�D`g
8A0A(B BBBAH�oB�E�B �B(�A0�D8�D`7
8A0A(B BBBAH�'B�G�B �B(�A0�A8�Dp�
8A0A(B BBBA`(gB�E�B �E(�D0�A8�DP�
8A0A(B BBBIC
8A0A(B BBBC`�HB�E�B �E(�A0�A8�DP�
8A0A(B BBBHg
8A0A(B BBBG<��B�B�E �D(�D0��
(A BBBA40[B�B�D �A(�D0D(D ABB,h�B�H�D �n
ABA4��B�E�D �I(�D0�(D ABBH�B�B�E �E(�A0�A8�Dp�
8A0A(B BBBB�G��d8�W�B�B �B(�A0�A8�G�J������H�������
8A0A(B BBBHL��B�B�A �A(�D0P
(A ABBHf
(F ABBG �]A�R0HAs�k&18�K�jZaq %P��`�� ���:�V�`��p��
�SP(P8`�FQ@�_k�
ozP
'��g���H�@��[�p�������p�$+ �=�]apr_array_push_nocleartable_getm_doapr_pallocmemcpyapr_is_empty_arrayapr_array_makememsetapr_array_clearapr_array_popapr_array_pushapr_array_catapr_array_copyapr_array_copy_hdrapr_array_appendapr_array_pstrcatstrlenapr_table_eltsapr_is_empty_tableapr_table_makeapr_table_copyapr_table_clearapr_table_getstrcasecmpapr_table_setapr_pstrdupapr_table_setnapr_table_unsetapr_table_mergeapr_pstrcatapr_table_mergenapr_table_addapr_table_cloneapr_table_addnapr_table_overlayapr_table_vdoapr_table_doapr_table_compressstrcpyapr_table_overlapapr_table_getmJ
��������`���������
���������
������������������
��������������������������
��������>
��������J������������������
�������������������������:
��������]
���������������������������
��������
��������D������������������
���������������� ��������Y
���������
���������
��������
��������;
��������f����������������	��������/	 ���������	���������
 ���������
 �������������������������!�����������������5��������L
Q$��������� ��������� ������������������
�$��������� ��������� ��������%��������R&��������)
��������T����������������^*���������
���������
��������)���������������������������������m���������
���������-�����������������Q���������
��+���������������� L�`��� �P��$`` ����`Hp\�p���P�`H@��
�P
,����@4lp��� �<p� ��.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @@p-�
&],]12]@0`.I�^�Y@04
�&�
	 +L07hbuiltins.o/     1747905038  1000  135   100644  2208      `
ELF>�@@
1��ff.�f���ff.�f��7���f.������f��)7�ff.������fD��������������7�f����ff.�H���H�7��H��H��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0DXl�
�
���	�# 40E@VP
g`
xp����	��apr_atomic_initapr_atomic_read32apr_atomic_set32apr_atomic_add32apr_atomic_sub32apr_atomic_inc32apr_atomic_dec32apr_atomic_cas32apr_atomic_xchg32apr_atomic_casptrapr_atomic_xchgptr 4H \0p@�P�`�p������.symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack.rela.eh_frame@�!�'�,0�.5J�E@��		���Tbuiltins64.o/   1747905038  1000  135   100644  1920      `
ELF>�@@
H��ff.��H�7���f�H���H����H)7�ff.���H��DH������H�H���ff.�@H���H�7��H��H��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0D	Xl��	�$ 	50F@WPhp	y�apr_atomic_read64apr_atomic_set64apr_atomic_add64apr_atomic_sub64apr_atomic_inc64apr_atomic_dec64apr_atomic_cas64apr_atomic_xchg64 4H \0p@�P�p��.symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack.rela.eh_frame@�!�'�,0�.5�J��E@���h		�hTia32.o/         1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5mutex.o/        1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5mutex64.o/      1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5ppc.o/          1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5s390.o/         1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5solaris.o/      1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5dso.o/          1747905038  1000  135   100644  3064      `
ELF>�@@
SH��H�1�H��t���uH�C[�fD��[ÐATI��UH��H��SH���f�H�@H�EL�`H�EH�1�[]A\ÐH�FH�1��fDAUATI��H���UH��SH����H��I���f�H��H�@I�$M��t8L�hI�4$H���H�.H�F�H��1�[]A\A]�fD�H�CH���3N[]A\A]��H��H�?��UH��SH��H��H�~H���H��tH�E1�H��[]�fD�H�C�:N��H�OH��u�ÐSH��H��H��H���H�C[�No ErrorGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�/A�`
GF(<?B�I�G �iABh
H|�B�B�L �D(�D0Y
(C ABBGM(F ABB�(�@A�D�G [
AAG(Q�V/
0?+6p
L��Y`v�� ��0@��p(�dso_cleanupdlcloseapr_os_dso_handle_putapr_pallocapr_os_dso_handle_getapr_dso_loaddlopenapr_pool_cleanup_nullapr_pool_cleanup_registerdlerrorapr_dso_unloadapr_pool_cleanup_runapr_dso_symdlsymapr_dso_errorapr_cpystrn	��������F���������������������������
�
�����������������'
D��������a��������z
���������,�������� @0lp��� �0p.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@XP
&�,�12�	@0�.I^ Y@��
0@		p�Phbuffer.o/       1747905038  1000  135   100644  1776      `
ELF>�@@AUI��ATUH��SH��H��H�pH��t��C0��uP1�H�{pH��L�k@��H�kPE1�H�CH�C`H�CX�C0H��t�H��D��[]A\A]��H���A�ą�t�H�{pH��u���ff.�H�GP�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�8�B�E�A �D(�G0T
(D ABBHX�+CY�apr_file_buffer_setapr_thread_mutex_lockapr_thread_mutex_unlockapr_file_flush_lockedapr_file_buffer_size_get��������_	��������|
�������� \�.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@H	&�,�10�.:OhJ@`0	� 
	�r�Ycopy.o/         1747905038  1000  135   100644  2496      `
ELF>�@@AVA�ֺAUI��H��ATA�̹�UL��SH�� H�|$��Å�u3A����I��D��D��L��H�|$��Å�tNH�|$�H�Ġ ��[]A\A]A^�H�T$H�|$1�H��$���Ņ�����~��H�|$H�T$H��$�H�D$ ��Å�t�=~t�H�|$�H�|$��v���H�T$�pH�|$ ��Å�t=x�D���D�d$,L��D�������fDH�|$���H�|$�����DH�|$�H�|$�Å�t���f��������@I�ȉѺ�a����I�ȉѺ�Q���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�@�B�J�H �I(�D0�G�AJ
0C(A BBBD`t�*9M[m����apr_file_transfer_contentsapr_file_openapr_file_closeapr_file_write_fullapr_file_readapr_file_info_getapr_file_perms_setapr_file_copyapr_file_append.��������W��������g	���������
������������������	���������	����������������)
��������@	��������J	��������^	��������n	���������	�������� d�x�.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�P	&�,�10�.:O �J@H	��
	(�`Ydir.o/          1747905038  1000  135   100644  4984      `
ELF>8@@
H��H����t��H���AVI��H��AUI��ATUSH���H��tZH�߾ I���L��H��I�H��H����H�EI�L�`H�8H��H�@�[1�]A\A]A^��[]�A\A]A^��H��H�?��AVAUATI��UH��S��H���I�|$�I���I�D$H���sH�E`�PA�����vyH��ށ���H�Q�H���Bށ�����I�<$�EH�}A��tD�m�E�H���vQH�p��M��H�Eh�xE�H����[]A\A]A^ÐD�,��ڀ�A��E��n����H�M �M �I�t$I��L���H��L9�wkL��H)�H��I�D$H�p���I�$L����H���H�E`��t=xtI�D$H�H�Q��	����EI�<$��!�I�D$�����x�/t�H��$H9�s��/H���v���f�A�]�H�E`�E��D����ff.�H��H��1�H���ff.��SH�����H�߉����t��[�ff.�AUI��ATU��SH��H���A�ă�t!A���DD�H��D��[]A\A]�fDL��������H��tnA�|�/H�P�t�+A�|�/H�J���H��H��u�H��L���H���H�‰Ѓ�x+Hc�A�|
/t ��H�H)�L��
H���</t�…�y�ҸL��H��H�Hc���8�K���H�ډ�H���A�ą��&���H�ډ�L���A������f�H9��u����Z���f�H�����t��H����H��tH�FH�1�Ð�(N�f.�UH��SH��H�H��tH�hH��1�[]�f�H��� H��H�T$�H�T$f�@H�H�H�hH��1�[]�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�DXH4�B�H�E �A(�A0�Z
(C BBBDF(A DBB�@��B�B�B �D(�D0�I� �
0C(A BBBB�DO�"A�`8B�E�A �C(�G0^
(D ABBGHDT`4tXA�D�D0P
CACsCA
00 �=EP\r��������������"��07DSY0hPXdir_cleanupCSWTCH.1closedir__errno_locationapr_dir_openopendirapr_pallocapr_pstrdupapr_pool_cleanup_nullapr_pool_cleanup_registerapr_dir_closeapr_pool_cleanup_runapr_dir_readreaddirapr_cpystrnapr_statapr_dir_rewindrewinddirapr_dir_makeapr_unix_perms2modemkdirapr_dir_make_recursivestrlenapr_pstrndupapr_dir_removermdirapr_os_dir_getapr_os_dir_put	
����������������5
��������J��������^��������c
h
�������������������
������������������d�������������������������������������������������������������������������������4��������o��������w�����������������������������������!���������������������������������� 8 ���������Ld0xP.symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @�@�
&�,�10 900.B^W`�R@��
`
	h
w�afileacc.o/      1747905038  1000  135   100644  2224      `
ELF>�@@H�FH�1��fD�G�ff.��1���������€���E‰€ʀ��E‰ƒ�@��E‰€���@E‰ƒ� @��@E‰ƒ�@�� E‰ƒ�@��E‰€��� E‰ƒ�@��E‰ƒ�@��E‰ƒ���E��@1��������€���E‰€�@�ǀE‰€�@��@E‰€�@��E‰ƒ�@@�� E‰ƒ� @��E‰ƒ�@��E‰€� ��E‰ƒ�@��E‰ƒ�@��E‰ƒ���E���H���H��H��H��H�H���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�
0D�X�l�
& �:��N``vp�apr_file_name_getapr_file_flags_getapr_unix_perms2modeapr_unix_mode2permsapr_file_data_getapr_pool_userdata_getapr_file_data_setapr_pool_userdata_setd����������������� 4H \�p`�p.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�0	&�,�10�.:�O��J@��	�h
	��PYfiledup.o/      1747905038  1000  135   100644  3648      `
ELF>@@@AWAVAUI��ATA��UH��SH��H����uqH�H����1�@�p�‹{������tZH�sL�uL���I�FL�u�C0A�F0��uS�S4A�V4�S8A�V8H��[]A\A]A^A_�fD�~�A�ǃ������H��[]A\A]A^A_�fDI�~p��I�~@�L��S4�P4�S8�P8A���!�SH�8H�ƹ�����P��H��1�[]A\A]A^A_����I���fD�xL���H�xH��H�@pI��H��1�H)���x���H�L�uL��M�.E�~H�s��S0I�FH�EI�ƉP0���'����S4�P4�S8�P8�E���fDH�{p����I�~pL��1��L�uA�V0L����������H�sPL���H�SPI�F@H�EH�PP�����1��d���f������fDH���H�|$H�|$���H���AUATI��UH�պxSH��H��H����S0I�$H�(��u:H�sH��tM�,$H���I�E�Ct{�C����H��1�[]A\A]��H�sPH��I���H�SP�{`I�E@I�$H�s@H�PPH�x@tkH�SX�H�{pt�I�$H��1�H�xp�H�{p��i���H�;H�޺�I�4$�H����FHD���M���H�SH��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�xB�B�B �E(�D0�D8�G@e
8A0A(B BBBG_
8A0A(B BBBGT
8C0A(B BBBH�
�D X<�B�B�D �I(�J0}
(C ABBH��#?Uoz� 
�0�P����dup3apr_pstrdup__errno_locationapr_unix_child_file_cleanupapr_unix_file_cleanupapr_pool_cleanup_registerapr_pallocapr_thread_mutex_createapr_file_dupapr_file_dup2apr_file_setasideapr_pmemdupmemcpyapr_thread_mutex_destroyapr_pool_cleanup_killapr_pool_cleanup_nullA��������V	���������
������������������


��������A��������|	��������������������������l���������	������������������������������������������

$��������-
5
:

G��������U�������� � �0�P.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @[@@@	&�,�10�.:�O�J@�
`	�X
	(�
Yfilepath.o/     1747905038  1000  135   100644  4160      `
ELF>
@@
U�H��SH��H��H���H��tH��H���H�H��1�[]�D��$���"D�H��[]�@H�����t��H����H��:/t�5N�f�UH��H��SH��H���H�EH�H��@H�H���x�/t�H��1�[]�f�AWAVAUATUSL��H��HH�|$ H�t$�L$(H����:/I�����D$(��H�|$H�����H�D$L���H�L$H�t�$H����H���A�>/H����H�D$�8/t�5N�D$(�iL�|$H�t$H��L���L��M����B�|;�/��M��/L�|$�~�Ȩ�y�4N�D$(�H�D$H���'�D$(�H�t$(H��H�|$8����nH�D$8H�D$���I��A�>/t��/A�H�D$�D$(A����D$,D��tqL��M����/u��@L���EL�m��t</u�M��M)�t:��.��I��u��u*I��u����<J�<;L��I��L��M���E����B�;L�|$L9|$s�D$(�(H�D$ H�1�H��H[]A\A]A^A_�H�D$H��t5�8/��H������A��D$(����H�D$E1�����H�D$H�D$�����A�UM�u���A�~.�0���I����M��ub�T$,������J�<;����H��A����t1��ƒ���@�4D9�r�1�A�}��M�|L9|$����EL�|$����I����vB�|;�/../t�I��t^B�|;�/u��TL�t$L��H��L�����u!C�|>�/�����B�;�������</�����H��H�7N[]A\A]A^A_À;/tVE1�L9|$�Q����D$,���`�����f����g���H�D$I��H�D$���f�;..�X����{/�N��������L$,��u�H�D$����4N�����H�Ѻ:�H�Ѻ:��1��/../GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0\A�I�J� b
CAFYAAPDT$hNQ�G�L eCAd��B�B�B �B(�A0�A8�G�
8A0A(B BBBAK
8F0A(B BBBA�

 	\%6`GM�N_��ry����
���
���	apr_filepath_getgetcwdapr_pstrdup__errno_locationapr_filepath_setchdirapr_filepath_rootapr_filepath_mergestrlenapr_pallocmemcpystrncmpapr_filepath_list_splitapr_filepath_list_split_implapr_filepath_list_mergeapr_filepath_list_merge_implapr_filepath_encoding	��������(
��������A��������e
��������n���������
�
����������������+��������O�����������������������������������
?���������q�������������������������� T`l������$�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@
�
&9,9129@0@.In^p0Y@��
�X	��hfilepath_util.o/1747905038  1000  135   100644  2480      `
ELF>�@@AVI��H��AUI��ATA��USH���D$�T$�H��H�D$H����E��H��1��fDH�xH�|$H��tD����H��u�H�D$���L���I���H�T$H�t$H���H��H��t�;t�L��1��H���f.�M�&H��1�[]A\A]A^�fD1��@�~���AWAVAUA��ATUH��SH���VH�L$H�<$����H�FD�z�1�L�pO�$��	DI��H�8�H�L��M9�u�H��t|H�|$J�t;�I��H�$L� �E��~C1�f�H�EL�<�L���I��H��tH��tE�,$I��L��L��L��M��H��9]�A�$H��1�[]A\A]A^A_�H�$H�H��1�[]A\A]A^A_�@�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�@�B�H�E �D(�A0�D@�
0C(A BBBGh`	Q�B�B �E(�A0�D8�DP�
8C0A(B BBBDO8C0A(B BBBE�������*1@KZ�	w~�apr_filepath_list_split_implapr_pstrdupstrchrapr_array_makeapr_strtokapr_array_pushapr_filepath_list_merge_implstrlenapr_pallocmemcpy"��������]	��������z
��������������������������8��������W��������|����������������� d�.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@H�	&),)10).:WOX�J@ 0	 �
	��PYfilestat.o/     1747905038  1000  135   100644  4528      `
ELF>�@@ATUH��SH���Gp�s�~��C�E%�=`�)���=�t*�=�t�=�t=��EЋEH�uH�SH�{HI��S㥛� �C�E �CH�E0H�C8H�EH�C(H�E�C0H�EH�C �H�MPH�uXH�{PH��H��?I��H��H)�HSH�H�M`H�uhH�{XH��H��?I��H��H)�HSP�H�MpH��H��?I��H�E@�KH��	H��H�C@H)�HSX[]A\��= �+����=@����������	���ff.�ATA��UH��SH��H���B0��tH�����u�sH�����t��H�Đ[]A\�f�H�H��H��H�EH�CH�E`�&����E�x��D!�E�H�Đ[]A\�f.�ATA��UH��SH��H���B0��tH�����u�sH�����t��H�Đ[]A\�f�H�H��H��H�EH�CH�E`����E�x��D!�E�H�Đ[]A\�f.�SH�����H�߉��1҃��t��[��[����DAUI��ATI���UH��S��H����H��t#���tZ��H�Ę[]A\A]�D���u�M�,$H��L��I�l$`����A�D$�x��!�E�H�Ę[]A\A]�@M�,$H��L���I�l$`�����ff.�@1���u	��ATA��H��UH��S�ӺpH�ĀH�����u6�t$��tA��tE������t$��tA��t ���t$H���H��[]A\�D�����t$��@��"�t$�ff.��ATH�Ѻ@UH��SH��H��H��H�|$ �A�ą�tH�ĠD��[]A\�@H�t$hH��H��4�ׂ�CH��H��H��H��?H��H)�H��H�$Hi�@BH)�H��H��H��?H�t$H��H��H)�H�T$Hi�@BH)�H�\$�����{����D� H�Ġ[]D��A\��AUI��ATI���UH��S��H���vH�����t��H�Ę[]A\A]��H�EM�,$H��L��I�D$`����غx���E�A�D$��!�E�H�Ę[]A\A]�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�,bB�A�D �"
ABD<L�B�D�D �J�u
 AABCq AAB<��B�D�D �J�u
 AABCq AAB�+A�^
AFL��B�E�I �D(�I�_
(A ABBFu
(A ABBE0<�R�G�D �K�F
 AABF<p�B�I�D �M�X
 DABE� AAEH��B�E�I �D(�I�]
(A ABBH{(A ABBb+=p�Vlu�����+��������p����fill_out_finfo.isra.0apr_unix_mode2permsapr_time_ansi_putapr_file_info_get_lockedapr_file_flush_locked__fxstat__errno_locationapr_file_info_getapr_file_flushapr_file_perms_setapr_unix_perms2modechmodapr_stat__lxstat__xstatapr_file_attrs_setapr_file_mtime_setutimesapr_stat_fd���������	���������	���������	���������������������������
����������������3��������<
���������������������������
������������������
��������	��������������������������2������������������
����������������

�������� Pp�����@pt��.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @j@h(	&�,�10�.:�O��J@�
�	�p
	@
'PYflock.o/        1747905038  1000  135   100644  1816      `
ELF>@@AT��f�I��U��SH�� )$)D$��t	�f�$1ۃ��Ã�A�|$H���1���Ņ�y����t݃��tH�� 1�[]A\����
�D�H�� []A\�ff.��U1��f�SH��H��(H�D$�D$f�D$f�$D$�}H��1���Å�y����t܃��t1�H��([]�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�<�B�J�D �D@N
 CABHO AAB$\eA�L�G@NAA�&�eapr_file_lockfcntl__errno_locationapr_file_unlockC��������N	������������������	�������� `�.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@(`	&5,5105.:cOh�J@�0	�
	�6�Yfullrw.o/       1747905038  1000  135   100644  2464      `
ELF>�@@AVI��AUI��ATE1�UH��SH��H��DH�T$H��L��H�\$�H�T$H�H)�Iԅ�uH��u�M��tM�&H��[]A\A]A^�ff.�@AVI��AUI��ATE1�UH��SH��H��DH�T$H��L��H�\$�H�T$H�H)�Iԅ�uH��u�M��tM�&H��[]A\A]A^�ff.�@AWI��AVAUI��ATI��UH��SH��H�D$H���DH��H��E1�H��LpH��H9�u�H�L$L��L��H���M��t	H�T$I�$��urH�t$L9�thM����H����I�UH9���I�M1��DH��tKH��H�IH�Q�H9���H��H)�I9�u�H�t$H����M��tM�4$H��[]A\A]A^A_�DH�D$�I9�vЄ�t�H��H��I��I�UI�uH�L$H��H��I���I9�v���t���H�t$H)�1�H7H��������@E1�����1��H���V���I�UL��1���L��H��L�H�W�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�<aB�E�E �D(�D0�G@}0A(A BBB<\aB�E�E �D(�D0�G@}0A(A BBBL��B�E�B �E(�D0�D8�DP�
8A0A(B BBBFa"pa6E��Zapr_file_read_fullapr_file_readapr_file_write_fullapr_file_writeapr_file_writev_fullapr_file_writev1���������
��������<��������	��������A	�������� `p��.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�x	&�,�10�.:�O��J@�H	�8
	j@Ymktemp.o/       1747905038  1000  135   100644  2232      `
ELF>�@@AVAUI��ATI��UH��SH����tWH������D$�����L���H�t$L���M�4$H��L���I�F��tO1�H��[]A\A]A^��H����D$���t=L��GH�t$L���I�$H��L���H�C�|$1������u��H��[]A\A]A^�fD���|$���1�����t�I�$��H�8H���I�$�`����1��?���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�\B�B�E �D(�D0�D@K
0A(A BBBHY
0A(A BBBG)5;Lh~apr_file_mktempmkstempapr_os_file_putapr_pstrdupfcntl__errno_locationapr_unix_child_file_cleanupapr_unix_file_cleanupapr_pool_cleanup_register��������>	��������M
��������t���������	���������
������������������������������������

�
�������� .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@  	&],]10].:�O�xJ@@	�
	��XYopen.o/         1747905038  1000  135   100644  7024      `
ELF>p@@ATUS�o0H����uJD�c�C����D�����u#�Cu=H�{pH��t
���E��[]A\�D�c���������H�{��ff.�f�USH��H���o�G���������uH�{pH��tH��[]�fD�k��H��[]��AW��AV��AUATUSH��(��������A�
����p��t��@����@��@D�Ѓ�D��@����A��M�ĉӀ���I��I��E�����E�����E��
A��D��%�=�������$����‰�L��1���Ņ��=D�����xL���L��H�xH��H��H�@pH��1�H)���x���H�I�UL��Z�jL�"H�T$�H�T$I�mH�B1������E4�E0��H�E@H�����H�EH�E(�E8H�EhH�EHH�EX�E`E����E1�H��(D��[]A\A]A^A_�D1��r���f���_���fD������fD������1������������D�D�0�fD�L���H�E@I�mH�EP�E����H�D$H�Ep����H�}��H����.���D1�L��H�|$�L$��L$������A������f�1���������E�����!��������f�A�
���DH��H�?��H�����t��H����H�����t��H�����F�1���AVI���xAUI��ATA��UH��H��S�H�xH��H�@pH��H��1�H)���x���H�H�]H������CH�C4A�L�+�CD���H�C(�����C1�A�����C0u[1�]A\A]A^�@L���H�}H�C@H�GP�Gt�[L��]H��pA\1�A]A^�ff.�@��~�D��ff.�H����H�щ�H�t$�D$�H���ff.�f�H����H�щ�H�t$�D$�H���ff.�f�H����H�щ�H�t$�D$�H���ff.�f�H��H��H�t$�D$�H���ff.�f�H��H��H�t$�D$�H���ff.�f�H��H��H�t$�D$�H���ff.�f�USH���G�Ł�um�tH����[]�DH���1������tQ��{���1�����t8H�;H�޹��K�H����[]��H����[]�f���(H��[��]ËW���u	��%u
�f�SH���1������t@���{���1�����t'H�;H�޹��c�����1�[���[��ff.�@H��ff.��H���1҃��t��H���f���H�����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�(sB�A�A �}
ABD0HIA�A�G b
AAKNAAH|�B�D�E �B(�A0�A8�D`�
8D0A(B BBBF��DT�DTH �B�J�E �D(�G0�n
(C BBBEd(D FDBl�#D ^�#D ^�#D ^�#D ^�#D ^�#D ^H�A�A�D X
CAFP
CADI
CACKAC\�a�O
HF| �.DR
JKs*CTcj�I�������������+�4;K �[h #�P#��#��#��#�#�@�!<��Spe�.nhas_o_cloexec.8252apr_unix_file_cleanupapr_thread_mutex_destroy__errno_locationapr_file_flushunlinkapr_unix_child_file_cleanupapr_file_openapr_unix_perms2modeapr_pallocapr_pstrdupfcntlapr_pool_cleanup_registerapr_thread_mutex_createapr_file_closeapr_pool_cleanup_runapr_file_removeapr_file_renameapr_os_file_getapr_os_file_putapr_file_eofapr_file_open_flags_stderrapr_file_open_flags_stdoutapr_file_open_flags_stdinapr_file_open_stderrapr_file_open_stdoutapr_file_open_stdinapr_file_inherit_setapr_pool_cleanup_nullapr_pool_child_cleanup_setapr_file_inherit_unsetapr_file_pool_getapr_file_link	��������5
��������M��������Y��������m
���������	�����������������������������������������������������������������������	�������������������������5
:
B��������_���������������������������
�
�����������������������������������=�����������������:��������j�����������������������������������*��������v������������������
&�
�'�������������������������(��������8
=
I'��������Y���������+������������������
�������������������������� L���������$ p� �P�������@`��p��.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@h�	&�,�10�.:O �J@H�	�
 
	�sYpipe.o/         1747905038  1000  135   100644  4328      `
ELF>�
@@AWAVAUI��ATI��UH��SH��H��H�|$�����+L��xE1�I���xH�xH��H�@pH��H��L��H)���x���H�H�UL��L�*I������D$L�j(L�r0D�j8�B�B H�B�BH�Bp�H�xH��H�@pH��H��L��H)���x���H�H��L�r0�D$L�"L�j(�BH�E�B H�BH�8H���BH�Bp��H���H�8H���H��1�[]A\A]A^A_�fD��H��[]A\A]A^A_�f�U�SH��� tH����[]�fDH��H�w(�G41�H��x?��tۋ1Ҿ1���{�����1�����tP�C4H����[]Ã�t��1Ҿ1���{����1�����t�C4�f���D��(�U���@H��t@��t+��tSH��H�81��H�;1�[����D��H�?1����fDH�81����ff.�� �t�@H�G(H�1��fDAUI��H��ATI��xU��SH��H���H�xH��H�@pH��H��1�H)���x���H�I�uH�H�FH�����H�F4A�$H�H�F(�����F��t4�F0H�߹�H�Fp�H��1�[]A\A]�fD�F1��F0H�FpH��[]A\A]�ff.�f�H��1�����fDH���X����ATA��H��UH��SH��H���7�����uD��H��H�߉D$�Q����D$H��[]A\�@ATA��H��L��UH��SH��H������uD��H��H�߉D$�����D$H��[]A\ÐSH�����H�߉��1҃��t��[��[����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�`nB�B�B �E(�D0�D8�GP+
8C0A(B BBBGK8A0A(B BBB4��A�F�D J
CAGK
CAA�RS�S��H��B�H�I �C(�G0�
(C ABBG\(A ABB4
H,\<B�G�D �G0c AAB,�?B�J�D �G0c AAB�+A�^
AF�n0R!7Mgxp���������
����<�?0+7Kfile_pipe_blockpipeapr_pallocapr_pool_cleanup_nullapr_unix_file_cleanupapr_pool_cleanup_register__errno_locationapr_file_pipe_timeout_setfcntlapr_file_pipe_timeout_getapr_os_pipe_put_exapr_os_pipe_putapr_file_pipe_createapr_file_pipe_create_exapr_file_pipe_create_poolsapr_file_namedpipe_createapr_unix_perms2modemkfifo 	��������C
���������
���������
 
%
��������-
2
=
��������Y�������������������������������������������!��������L���������
��������7
<
I
��������7��������A��������Q�������� �p�0����8�L�`����0.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @[@p
(	&�,�10�.:�O��J@��	�p
			R�
Yreadwrite.o/    1747905038  1000  135   100644  8080      `
ELF>�@@SH�wH��1�H�H�H)����uH�SH�[�f.������[�f�ATI��U1�SH�_HI�t$@H��A�|$H)�H��H��~#I�\$HH�H9�w�Il$h[1�I�D$H]A\ÐI�\$HH9�sH���u����t�[]A\��H���u��[]�A\�fDAWAVI��AUI��ATI��USH���`L�:��A�F8�����A�$I�l$A�F8����I���$I�FH�1fDH)�H�I9�H��IF�H��H��I�FHH�I�FHI)�tMI�^XI�v@H9�w�I�VPA�~����������Hc�I�FHI�v@I�^XI^h�f�L)�1�H��I�mE�H��[]A\A]A^A_�DH�Ht	�l�����u�A�F8I�FHA�F`I�FX�������L��M������I�E1��A�FL)�~�x����L)�Hc�e���I�E1��e����AWAVAUE1�ATUH��SH��H�H����D�o0H��I��E�����G8������H�EH�P�H�U�G8����H����I��A����I�Nj����H�U�{L���H���t�L�uH��t��L�H�EH��D��[]A\A]A^A_�H�pH��t�H��H��L�����H�{pA��H��t��뿐H�E�fDE1��������t#L�uA���f��CA�~�|���fDH�{(uL�uA��`���1��H�����t�DA���u��{H�UL���H���t������D�(����f�AWAVAUATI��UH��SH��H��D�o0H�E��t�C�I�Ƌ����H��}L���H���t�H�H��D��[]A\A]A^A_�@H�pA��H��t��E`�����E1�E��A��A �D�t$�?H�}H�Hf�Ic�H)�L��H9�HG�H}@H��A)�I��H�}HH�H�}HE����E����H�]PD�t$E1�H9�u��}`u	H����D�t$H��E1�H��H���@��tcH�A������@H�EhH��H+uXHuHH9�t�}1��H�EhH������E1�H�EXH�EH�E`���H�}(t�1�1�H�����u�H��}L���H��������A���t��]���H�H��H���DH�}pH���e�����[���f�H���H���H�}PLc�H�EHM��A������Lc(M�����B���ff.�AVI��AUI��ATI��US�G0H����t]H�pH��t��C`��������H�ChH��H+sXHsHH9���H�{pH�CXH�CHH��t
�D�{D��L���H��xI�E1�[��]A\A]A^�@I�E�[�(��]A\A]A^�fDH�{HtH���A����Ņ�uk�C`�X���H�{pH��t��눋{1��H�ChH����M����H�{p�(H�CXH�CHH��t����\����>���fDH�{pH���D�����:���f�H��(H��@�|$H�T$H��H�t$H�D$�H��(�@@��1��~8�fDH��H��H��H�T$H��H�D$�H���ff.�UH��SH��H���H��H��H��[1�H��]�f��`t
1���H�Ht���@USH���o0��t'H��H�pH��t'��{`t41�H�{pH��t�H����[]��{`t1�H����[]��H�{Ht�H��������DUSH��H��H�pH��t��C0��t�{`t<�{���uH�{pH��t�H����[]����(���H�{Ht�H��������t��f�USH��H��H�pH��t��C0��t�{`t<�{���uH�{pH��t�H����[]����(���H�{Ht�H�������t��f�AVAUATUSH����~g�B0Hc�H��I��L�l7���ujH��L9�r�D�H��<
t)I9��LH�T$H��H��H�D$�A�ą�t��L9�v@E1�H��D��[]A\A]A^�DH�zpH��t��}`��M9��L���>f.�H�T$H��H��H�D$�7���A�ą�uB�H��<
t4L9���H�EHH;EXsƒ}8�u�H�U@H�HH��H�MH��C�<
u�E1�H�}pH���=�����L9��;����3���H�}HtH���)���A�ą�uD�E`H�EHH�EX�.���fDH�}pE1�H��u�����@A�E����H�}pH�����������A����H�}pH��t�L��E1��Y���f.�UH��SH��H��H�T$PH�L$XL�D$`L�L$h��t=)D$p)�$�)�$�)�$�)�$�)�$�)�$�)�$�� �H�D$8H��tyH�D$ H H��H�L$H�D$(H�t$ �H��$H�D$H�D$@H�l$0�D$�D$0H�D$��Å�x
H�|$ ��H�|$8�H����[]û������GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�7A�d
KF@<�B�D�C �w
LBB]
ABHLADH�B�B�E �E(�D0�A8�D@�
8A0A(B BBBFH��B�B�B �E(�A0�D8�D@�
8D0A(B BBBAH2B�B�B �B(�D0�D8�GP
8D0A(B BBBELdWB�E�E �D(�A0��
(C BBBEN
(E BBBG�,D0g�
�%D `$�'A�D�G IGF 44kA�A�D r
CADL
CAH(lwA�A�G {
CAH(�wA�A�G {
CAH@��B�B�B �A(�A0�D@s
0D(A BBBF(�A�D�J��
CAA7@�0�C�WhxoP�}����2��0W���,��
	�%'%,0BPkQ�w_e@	ww��	�������file_printf_flushapr_file_flush_locked.part.0file_read_bufferedapr_file_write_full__errno_locationmemcpyapr_file_readapr_thread_mutex_lockapr_thread_mutex_unlockapr_wait_for_io_or_timeoutapr_file_writelseekapr_file_writevapr_file_putcapr_file_ungetcapr_file_getcapr_file_putsstrlenapr_file_flush_lockedapr_file_flushapr_file_syncfsyncapr_file_datasyncfdatasyncapr_file_getsapr_file_printfmallocapr_vformatterfree
��������d��������������������������?
��������i��������1����������������������������������9�������������������������������������������5��������e���������
��������J�������������������������������������������U�������������������������������������������&��������9��������Y��������~��������������������������
��������j��������������������������������������������	��������S	��������h	!��������|	���������	��������!
��������Z
���������
��������p��������
$��������6
g%���������&��������#
�������� @@���P�h0�������$08Pp��@	��	�.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�	&�,�10�.:
O
0J@��	8�

	��0Yseek.o/         1747905038  1000  135   100644  2928      `
ELF>p@@UH��SH��H���`t^H�WXH��H+ChH�H9�wH��xH�CHH��1�[]�f��{1�H���H���tEH�CX1�H�CHH�khH��[]����u�H�CX1��C`H�CH�@��H��[]�f.�AUI��ATA��USH��H���o0�G��t\H�pH��t�A����A��t~�E��tdH�{pH�ChH+CXHCHI�EH��t�H�Ĉ��[]A\A]�fD��I�u�I�EH���u���(H�Ĉ[��]A\A]ÐI�uH��������H�ھH����Ņ��r���I�uH��Ht$8�e������Z���fDI�uH��HsHHshH+sX�@������5���f�USH��H���G0H�t$��t8H�pH��t��C`��tU��uH�CHH�CXH�{pH��t��{H�t$������H�T$1�H�����H����[]�H�CHH��t�H�ShH�L$H�H9�}H)�H��H)�H9иHC�H�CHH���H�{pH�CX���C`H�CHH��t���u��b���D��(H��[��]�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�<�A�D�G f
CAJm
AAAsAAL\B�E�D �A(�J�[
(C ABBGf
(A CBBB4�A�A�G0o
CAD{AC�$5�CYq���setptrlseekapr_file_flush_locked__errno_locationapr_file_seekapr_thread_mutex_lockapr_thread_mutex_unlockapr_file_info_get_lockedapr_file_truncftruncateI��������q	���������
�����������������
��������:��������I
��������|�����������������
��������&��������>���������	���������
���������
�������� `���.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@`h	&,10.:>O@�J@�H	 �
	��Ytempdir.o/      1747905038  1000  135   100644  2824      `
ELF>�@@
SH��1�H���H��1�H���1�H��H�|$H�����tH��1�[�fDH�t$�!���u�H�|$�����H����[�DAVAUI��ATUH���SH��PH�D$H�\$0H�D$L�cH�D$ H�D$0H�D$8H�D$@H��H�|$���u"L�t$M��tL���H��H=���H��L9�tH�3�f�A�H�\$H��L��L�s������uH��L9�t9L�#H��L�������t�L��H���I�EH��P1�[]A\A]A^�f�H��A��}�����u�H��H�|$���t;H��P�.N[]A\A]A^ÐH��L���E������6���DL�d$�w���fDH�|$H��������t���/apr-tmp.XXXXXXTMPDIR/tmp/usr/tmp/var/tmpTMPTEMPGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�$kA�V _
CGfD\D{B�B�E �A(�I0�D��
0C(A BBBJq
0F(A BBBBk*8Gp{Xdkwtest_tempdirapr_pstrcatapr_file_mktempapr_file_putcapr_file_closeapr_temp_dir_getapr_env_getstrlenapr_pstrdupapr_filepath_get

	��������*
��������K��������Y��������~
���%��.�2������������������
P��������t
z
��������� Hp.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@h�
&+,+12+7@0b.I�^��Y@00
0�		��`hglobal_mutex.o/ 1747905038  1000  135   100644  5248      `
ELF>�@@USH��H��H��H�{��H��t	��t�H����[]ÐH��[]�DAVA��AUI��H��ATI��UH��S�H��D��L��H�(H�xH����Ņ�u.H�CH�;H�@�t1H�C��H���I�][��]A\A]A^��H�CH��1�H�����uH�;�fDH�{[]A\A]A^�ff.�@H�?H��tH�����)N�f�UH��SH��H�H��t��Å�uH�}��Å�tH�}H��t�H����[]�ff.�f�UH��SH��H�H��t��Å�uH�}��Å�tH�}H��t�H����[]�ff.�f�AUATI��USH��H��H�H��tH��B��Ņ�u"I�|$H����Ņ�tI�|$H��t�H����[]A\A]���I�|$H��I����Ņ�u�I�t��L��H)øHH��f.�USH��H��H��H�{��H��t	��t�H����[]ÐH��[]�DH�H�H�FH�GH�FH�G1���H��H�?��H���H���H���H���H��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0;A�A�G a
CABDAAHP�B�E�H �I(�D0�R
(C BBBIe(A BBB�$�CA�D�D uCA$�CA�D�D uCA8�B�B�D �A(�G0
(C ABBI0<;A�A�G a
CABDAAp��	�	�	�	�;-F@�^i����� C)=UpCn��������`;(�@�Yn�	���	���	��	(global_mutex_cleanupapr_proc_mutex_destroyapr_thread_mutex_destroyapr_global_mutex_createapr_pallocapr_proc_mutex_createapr_pool_cleanup_nullapr_pool_cleanup_registerapr_thread_mutex_createapr_global_mutex_child_initapr_proc_mutex_child_initapr_global_mutex_lockapr_thread_mutex_lockapr_proc_mutex_lockapr_thread_mutex_unlockapr_global_mutex_trylockapr_thread_mutex_trylockapr_proc_mutex_trylockapr_global_mutex_timedlockapr_thread_mutex_timedlockapr_proc_mutex_timedlockapr_time_nowapr_global_mutex_unlockapr_proc_mutex_unlockapr_os_global_mutex_getapr_global_mutex_destroyapr_pool_cleanup_runapr_global_mutex_lockfileapr_proc_mutex_lockfileapr_global_mutex_mechapr_proc_mutex_mechapr_global_mutex_nameapr_proc_mutex_nameapr_global_mutex_perms_setapr_proc_mutex_perms_setapr_global_mutex_pool_get��������"	��������]��������u���������

�
������������������3��������B��������V�������������������������������������������������������������!��������1��������A��������n������������������
7	�����������������
������������������!���������#���������%���������'��������)�������� T@�� �p�@`t�����������.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@�	&T,T10T.:�O��J@�P	�
	�	B Yproc_mutex.o/   1747905038  1000  135   100644  22568     `
ELF>hT@@1��ff.�f����f.�H�G�`0f��GH�(�SH��H�(�{t�CL��u#[�D���u)�CLH�{(��t�@H��(���uH�{(��D1�[�ff.��H��PL�@��u1��@UH��SH��H��H�x(H��(�H�3H����H��1�[]ÐUH��SH��H�����H��H�����H�}(H��H��4�ׂ�CH�H��H��H��H��?H��H)�H�$Hi�@BH)�Hi��H�\$���ntB��t=�u�ELH�}(��uJ��E1�H��[]�DH�(���tރ�u¸w���H�(��DH��(�H�}(말H���HH�����ff.�@H��1������=wD�H���H���������@AUATUSH��H��8H����H��H���H�;H��H��H�D$�H�t$H��H����UE1���t"��@D��H��i���A��U��u�L�l$���1�� L����f��I�ċ�������L��1����H��H��t�L���H�k8H�;L���H�;�H��H�C��1�H��8[]A\A]���L�l$� H��4�ׂ�CI��H��L��L��H��?H�ѺH��H)�Hi�@BI)�1���M���f.���$u��D$�@A�$���y������L��1����H��H��t��!���ff.�f�� ���u1��DH��1�1�1�1��1�H����AUI��ATI��UH��SH��H�7H��te�PL���H��L��L� H���L�1�H�{@H�C�H�����uH�S@�R�CH�S I�]H��[]A\A]�f�H�nH��u�1���UH��SH��H��@H�EH��P=�u7H��~JH��'~�'H��'���fDH��1���@��u�EH��[]�fDH���w[]�@H����H���S��H��t	������uH�{(�0���u[�f�[�ff.�f�AT1��UH���SH������E1�A�����01�A���H�E(H�����D����ELH�|$�E������Å����H�|$��Å��|�H�|$��Å�ug�H�|$��Å�uRH�}(H�t$��Å�u>H�E(H�|$�@(�E��Å�u|H�}��H����@H�����H�|$�H����[]A\���H����[]A\�fDH�E(�D���H����[]A\�fDH���H���H����[]A\�ff.�f�H��H�8���x1�H����H������H���GH�8���x1�H��ÐH�������H��������D�H���DSH���f.���8uH�{8���x��C1�[�fD[�DUH��SH��H����H���H��4�ׂ�CH�4H��H��H��H��?H��H)�H�$Hi�@BH)�Hi��H�t$������u$H�}8H�����x��EH��1�[]�@��n�wD�H��[]�fD�����w=�D�H��[]�ff.�@SH���f.���8uH�{8���x��C1�[�fD[�R���f�SH����H��p�T$�L$��{ �H��f�D$1�1��1҅�x
H��p��[�f���H��p[��ÐSH���G�
��8u�{ �����x�1�[�@[����f�SH���f.���8u&�{ �����x��C1�[�D[���f.�SH���f.���8u&�{ �����x��C1�[�D[�*���f.�SH��H��H����H��4�ׂ�CH��H��H��H��?H��H)�H�$Hi�@BH)�Hi��H�t$�D����u,�{ H������x��CH��1�[�@���wD�H��[������w=�D�H��[��U���SH��1�H����C ���tn1��ǹ1�����x-�CH�;H��1���H����[]�fD��{ �(���u)�C ����H����[]�f���(H��[��]�1�1�1�1���C ������f.�H�t1H���Ё�@� �������Dʉ����x1�H���fD1��DH���W����H�t1H���Ё�@� �������Dʉ����x1�H���fD1��DH�������SH���G�
��8u�{ ����x�1�[Ð[����f.�USH��H���tQH�{@1�H��t��ŋCH��u�{ ���t���u���t2f�H�{H��t�H����[]�f��[����Ņ�t�����(���SH���f.���8u&�{ ����x��C1�[�f.�[�:���f.�SH���f.���8u&�{ ����x��C1�[�f.�[���f.�USH��H�k@H��H�?H��t{�L�H��H�C�FH����Ņ�u<H�C@H�;H�޹��@�CH�C�C �H����[]�fDH���`���H����[]����H�H��FH�CH������ff.�USH��H�k@H��H�?H��tk�L�H��DH�C�FH����Ņ�u6H�C@H�{�@�CH�C�C �H�;�H�޺�H����[]�D��H�H��FH�CH������ff.�SH���G�
��8u&�{ 1������x�1�[�f.�[���f.�USH��H���tAH�{@1�H��t��ŋCH��u�{ ���t����u��t"H����[]�f��[����Ņ�t�����(���SH���f.���8u&�{ 1������x��C1�[�[�j���f.�SH���f.���8u&�{ 1������x��C1�[�[���f.�H��H�?��������f����f��f�
H�H���H�H����f���f.�AVI���PAUI��H��ATI��U��S�f�@ @0@@@L� H�@(H�@8�@ �����@H���~H��$�DH�@�L��H��Ѕ�uI�][]A\A]A^�f.�H�@��ΐH�@�뾐H�@�뮐H�@�랸��f.�H�H��H��H��H�@H�@8��f.�H�G�`f�H�G�`f�H�G�` f�H�G�`(f�H�G�@H��H�GH�@P��H�GH=tH=t1��f�H�G�ff.�H�G�`@f�H��ff.���oF �oN0OH��t	H�F�@H�1��ff.��oF 1��oN0O�ff.��M���wAVI��AUI��ATM��U��S��H��H�H���"H�@(H�@8�@ ����H�@@�@H���=�$�@H�@M��tA������P 1�H�p H�x@L�����u"��tI�u�L��D$���D$H��[]A\A]A^��H�@M��t�I�VH����H�P(�H�@M��t�I�VH����H�P8�q���DH�@M���L����V���f�H�@M���4����>���f.��PL���f�@@ @0@@I�EL� ����"N�f.���"���������ff.��I��1ɺ�A���/ApR.%xH%x/ApR.%lxZ%lx/dev/zero/tmp/aprXXXXXXsysvsemflockfcntlpthreadposixsemGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0DXlTA�U
Js$�OY�D�G fCA(��A�D�D0�
AAF��DX8 �B�B�A �A(�G`�
(A ABBH\(TS8t�B�E�D �D(�D0]
(A ABBJ0�|A�D�G [
AAGDFA�DK�3A�e
JA\�B�H�I �D0
 CABDK
 CABG[
 CABGL CAB|)DS
ID�)DZ
BD�DV�;A�p
GA<��A�D�D0~
CAEO
AAGVAA4>A�p
GA(TOA�I�p
CCKA�>A�r
EA�FA�y
FA�FA�y
FA0��A�G x
CEO
AHVA@�A�K�I H
CAGZ
CAJK
ACAXIKfODxIKfOD�6A�m
BA(�yA�A�G I
CAJ�FA�t
KAFA�t
KA4$�A�A�K `
CAGL
CAH(\�A�A�K i
CAF�FA�t
KA(�iA�A�G y
CAJ�FA�{
DA�FA�{
DA(�<<P�B�J�H �D(�C0�s
(A BBBK������	%0DX"lX��K�E�E �D(�C0�F@�
0A(A BBBH������P@������20M@Tf�O��������� ��(+�G�|i����2Uu���� 3`�)�)B )[P~P�P�P�p;��#�><�OV	>n@�P	F�F��	F�L��	���
�
pI%�I@6YPyr�F� 
F�p
��0���F� 0i�F:  M�Ff�Xy@X��X�X��X	
� ��&7Mgt�������)5<HV`Qg	l�����			&	4	=	Q	W	b	i	p	v	"�	�	�	@�	�	P��	��	�

�8
L
 c
0|
@�
P�
`	�
p%�
��
��"�2�K[�proc_mutex_no_child_initproc_mutex_no_perms_setproc_mutex_pthread_releaseproc_pthread_mutex_unrefproc_mutex_pthread_child_initproc_mutex_pthread_acquire_exproc_mutex_pthread_timedacquireproc_mutex_pthread_tryacquireproc_mutex_pthread_acquireproc_mutex_posix_createproc_mutex_sysv_cleanupproc_mutex_flock_child_initproc_mutex_spinsleep_timedacquireproc_mutex_pthread_cleanup.part.2proc_mutex_fcntl_acquire.part.24proc_mutex_fcntl_release.part.21proc_mutex_flock_acquire.part.18proc_mutex_flock_release.part.16proc_mutex_fcntl_perms_set.part.15proc_mutex_flock_perms_set.part.14proc_mutex_sysv_acquire.part.11proc_mutex_sysv_release.part.9proc_mutex_posix_acquire.part.7proc_mutex_posix_release.part.4proc_mutex_posix_cleanup.part.3proc_mutex_pthread_cleanupproc_mutex_pthread_createproc_mutex_posix_cleanupproc_mutex_posix_releaseproc_mutex_posix_tryacquire.part.5proc_mutex_fcntl_tryacquire.part.23proc_mutex_flock_tryacquire.part.17proc_mutex_sysv_tryacquire.part.10proc_mutex_posix_tryacquireproc_mutex_posix_timedacquireproc_mutex_posix_acquireproc_mutex_sysv_perms_setproc_mutex_sysv_releaseproc_mutex_op_offproc_mutex_sysv_tryacquireproc_mutex_op_tryproc_mutex_sysv_acquireproc_mutex_op_onproc_mutex_sysv_timedacquireproc_mutex_sysv_createproc_mutex_flock_perms_setproc_mutex_fcntl_perms_setproc_mutex_flock_releaseproc_mutex_flock_cleanupproc_mutex_flock_tryacquireproc_mutex_flock_acquireproc_mutex_flock_createproc_mutex_fcntl_createproc_mutex_fcntl_releaseproc_mutex_unlock_itproc_mutex_fcntl_cleanupproc_mutex_fcntl_tryacquireproc_mutex_lock_itproc_mutex_fcntl_acquiremutex_sysv_methodsmutex_proc_pthread_methodsmutex_flock_methodsmutex_posixsem_methodsmutex_fcntl_methodsapr_proc_mutex_cleanuppthread_mutex_unlockpthread_mutex_destroyapr_atomic_dec32apr_atomic_inc32apr_pool_cleanup_nullapr_pool_cleanup_registerapr_time_nowpthread_mutex_timedlockpthread_mutex_consistentpthread_mutex_trylockpthread_mutex_lockstrlenapr_pstrndupapr_hashfunc_defaultapr_snprintf__errno_locationsem_opensem_unlinkapr_pstrdupsemctlapr_pmemdupapr_file_openapr_sleepmunmapmmappthread_mutexattr_initpthread_mutexattr_setpsharedpthread_mutexattr_setrobustpthread_mutexattr_setprotocolpthread_mutex_initpthread_mutexattr_destroysem_closesem_postsem_trywaitsem_timedwaitsem_waitapr_unix_perms2modesemopsemtimedopsemgetfchownflockapr_file_closeapr_file_mktempfcntlapr_proc_mutex_destroyapr_pool_cleanup_runapr_proc_mutex_unix_setup_lockapr_proc_mutex_defnameapr_proc_mutex_createapr_pallocapr_proc_mutex_child_initapr_proc_mutex_lockapr_proc_mutex_trylockapr_proc_mutex_timedlockapr_proc_mutex_unlockapr_proc_mutex_mechapr_proc_mutex_nameapr_proc_mutex_lockfileapr_proc_mutex_perms_setapr_proc_mutex_pool_getapr_os_proc_mutex_get_exapr_os_proc_mutex_getapr_os_proc_mutex_put_exapr_os_file_putapr_os_proc_mutex_putaJ��������}L���������M���������
N�
@�O��������P��������WQ��������wR���������S���������T���������L��������=U��������PV��������`W���������
�X���������Y���������Z���������[���������\���������
N
IO��������)P��������U
mX���������Z���������]��������$^��������5\��������O_���������`���������`��������Y��������=a��������n
xb���������c���������d���������e���������f���������g��������h��������(i��������Jj��������Y
N^
IfO��������~j���������Y���������Y���������d���������k��������0l��������UY���������Y���������m���������P��������Y��������$n���������Y���������o���������p���������]��������	Y��������!	Y��������3	
@8	q��������a	Y��������s	
Fx	q���������	Y���������	
L�	q��������A
Y��������X

L]
r���������
s���������
]���������

N
IO��������Y��������AY��������Y]���������t���������t��������!Y��������3u��������kv���������d���������w���������Y���������Y���������u��������1
Y��������C
u���������
\���������
_���������

N�

I�
O��������
"\��������x��������F\��������b_���������w���������
N�
I�O���������
"�\���������x���������Y��������

y��������Kv��������ad���������Y���������Y���������
 �y��������Y��������
 y��������G
IaDlLr>}F�8�@� �(��0�������������
1��������g?t?�y
�
�?@�
`�?��
p
�?�
 �?��
0v?�~?�p?8|?������������
N�
I�O���������?@?,?�D?�i��������<J��������WK��������L{����������p� �(p0�8(@@HxP�X`xh��p
� 
������P��p�9�0������0 �0?H`PX�`�h0p x���E��
��	�P	��	�	������1 �p �( 0�8@PM 4H \0p@��������$ `�x���  `��� �P�p��8�X��	�P	��	��	�
\p|���P�� 
(p
`0���0����@,P@�T���� �0�@�P` p4�H�\�p����.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.rodata.comment.note.GNU-stack.rela.eh_frame @�@�8&, R 12 VE�X @@�H�M0�.Vk�f@hN�
�h

I	`-q�Suthread_cond.o/  1747905038  1000  135   100644  3136      `
ELF>@	@@H����ATI��UH���8SH��H���1�H�(H�xH�����u!H�;��H�މD$�I�$�D$H��[]A\�fDH��H���ATL�fUSH�_H��H��xkH���L��H��H��4�ׂ�CH�(H��H��H��H��?H��H)�H�$Hi�@BH)�H��Hi��H�L$��w��nD�H��[]A\�DL��H���H��[]A\�ff.��H����H����H��H�?��H��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�	,0ZB�D�I �G0 AAB`
<t�B�E�A �H0f
 AABFO AAB�	�	��	*ZAL^t�p
������� 	
0	8O@g|Pthread_cond_cleanuppthread_cond_destroyapr_thread_cond_createapr_pallocpthread_cond_initapr_pool_cleanup_nullapr_pool_cleanup_registerapr_thread_cond_waitpthread_cond_waitapr_thread_cond_timedwaitapr_time_nowpthread_cond_timedwaitapr_thread_cond_signalpthread_cond_signalapr_thread_cond_broadcastpthread_cond_broadcastapr_thread_cond_destroyapr_pool_cleanup_runapr_thread_cond_pool_get'
��������8��������D
I
U
����������������������������������G
��������y��������%��������5��������L�������� 4dpx�� �0�@�P.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @T@�P	&�,�10�.:�O�J@ �	�p
	8��Ythread_mutex.o/ 1747905038  1000  135   100644  3600      `
ELF>@@H����AUI��H��ATA��0UH��SH���f�A��H��@@ H�(t]H�|$��Ņ�tH����[]A\A]���H�|$��Ņ�u[H�{H�t$�H�|$�����H�x1���Ņ�u�H�;H�޹��I�]H����[]A\A]ÐH�|$��l����H����H��H�����t����D�H���ff.�@UH�oSH��H��~iH���H��H��H��4�ׂ�CH�H��H��H��H��?H��H)�H�$Hi�@BH)�Hi��H�\$���t��n�wD�H��[]�DH�����t��wD�H��[]�f.�H����H��H�?��H��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�	L0�B�H�I �D(�D@t
(C ABBIf
(C ABBB�	�!D\0��A�E�D0f
AAF[AA�	�	,�DOf������	�!50�P]u�	������thread_mutex_cleanuppthread_mutex_destroyapr_thread_mutex_createapr_pallocpthread_mutexattr_initpthread_mutexattr_settypepthread_mutex_initpthread_mutexattr_destroyapr_pool_cleanup_nullapr_pool_cleanup_registerapr_thread_mutex_lockpthread_mutex_lockapr_thread_mutex_trylockpthread_mutex_trylockapr_thread_mutex_timedlockapr_time_nowpthread_mutex_timedlockapr_thread_mutex_unlockpthread_mutex_unlockapr_thread_mutex_destroyapr_pool_cleanup_runapr_thread_mutex_pool_get,
��������Q��������{���������
������������������
���������
�
������������������	��������C���������������������������
����������������������������������� 4����0�����.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@(�	&4,4104.:bOhJ@�	�	��
	8��
Ythread_rwlock.o/1747905038  1000  135   100644  3112      `
ELF>(	@@H����ATI��UH���@SH��H���1�H�(H�xH�����u!H�;��H�މD$�I�$�D$H��[]A\�fDH����H��H�������D�H���H����H��H�������D�H���H����H��H�?��H��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�	,0ZB�D�I �G0 AAB`	tDX�	�DX�	��	.ZGRf|�p	������	)�E^�	w�����thread_rwlock_cleanuppthread_rwlock_destroyapr_thread_rwlock_createapr_pallocpthread_rwlock_initapr_pool_cleanup_nullapr_pool_cleanup_registerapr_thread_rwlock_rdlockpthread_rwlock_rdlockapr_thread_rwlock_tryrdlockpthread_rwlock_tryrdlockapr_thread_rwlock_wrlockpthread_rwlock_wrlockapr_thread_rwlock_trywrlockpthread_rwlock_trywrlockapr_thread_rwlock_unlockpthread_rwlock_unlockapr_thread_rwlock_destroyapr_pool_cleanup_runapr_thread_rwlock_pool_get'
��������8��������D
I
U
���������������������������
��������u����������������������������������� 4dpx�����������.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�8	&4,4104.:bOh�J@��	X�
	���Yapr_pools.o/    1747905038  1000  135   100644  18632     `
ELF>�E@@
SH�G H��H��tH�H�S H�x�PH�C H��u�H�[H��tH������H�[H��u�[�ff.�f�H����AVAUATUH��SH��f�H�;1�1���=vt�CH�[H��u�H��E1�A��f.���t[H�[H��t'�C�P���u�H�;��H�[��ED�H��u�E��ugH���
�H�[H��t?�{u�H�;�	���f�H�;�	�떐H�}1�1�1��H�mH��t�E��u�H�mH��u�[]A\A]A^ÿ�A����H��E1��	H�[H��t7�{u�H�;1�1���=vtA�CH�[H��u�f�I����-�-���A���#���L��M���@E����f�AWAVAUATUH��SH��L�oL�'H�O�W I�uI)�K�$H��������I�]H�{H�S H)�H9���H�SH�H�H�PI�EH�CH�I�E L�+M�EH)�I�]H�CH%�H�YXH-H��A�EA�PH9�v;L���H��zH9�w�L�I�EH�XH�BI�EL�(H�YXI�UL�jH�{L���H�C LcH�]L�eH��H�EH��1�[]A\A]A^A_�fDL��'I���I9���H�q0I�����M�������I��I��I9���H�L9���H�~H��tH�t$�H�t$H�H�~J�\�(J�D�(H����L9���L���H9���H��H�H��H��t�L�L�H9�w	M���<�C��H�VHFH9�HG�H�FH�������� ��� ���H�q0H�A�A� L9��4���H�F(H��t^H�~H��tH�t$�H�t$H�F(H�~H��t/�HH��L9�r��f��KH��L9�s}H��H�H��u�H��t�L���H��H��t@I�D�pL�x H�{(H�H�{�} tH�E(I�EL�m(�E I�u�����H�������[]A\A]A^A_�@H��H�H��B����H��H��H���H��tH��H�<�t�H����L�����H�N(H���ff.�@S�H��H����H��tH�@H�1�[�f��[�f�ATI��UH���SH�_(�@H�H��H�;H��u�H��H9�u�[L��]A\�H�w�ff.�H�G�ff.�H�w �ff.�H�G �ff.�UH��SH��H��H�H��tK�H�EH���H�}H��H�H+EH�uH�EH9�wH��t=H��[]��H�u��f�H�EH���H��H�H+EH�uH�EH9�r�H��[]�fDH��'1�H���H9�wH�� � HC��f.�AUATUH��'SH���H��H9��H�����I�����I��I��I9��YH�I��L9���H�H��t
�I�EI�}K�\�(K�T�(H���yL9���L���H9���H��H�H��H��t�H�3H�2H9�r	H����C��I�UIEH9�HG�I�EH�������H�A�� I��L9��L���H�G(H��tMH�H��t�I�E(I�}H��t(�HH��L9�r��f��KH��L9�seH��H�H��u�H��t�H���H��H��t0H�D�`H�h H�C(H�H�CH��H��[]A\A]��H��1�H��[]A\A]�H��H�H��B�����H��H��H���	@H��tH��H�<�t�I�E�����L�����I�M(H����ATUH��SH�H��H��t�H�ML�ME1�H�E��H9���L�#I��L��M��tD�SL�H�rM��u�H����H�|�L�G(L�H9�vM��HD�H�_(H9�sr1�L��M��u�H�}H�MH�EH��t�M��tf.�I�$L���I��H��u�[]A\��H��wJH�t�H�~(H�;H�^(H��uH9�vH��H��H)��@����H�}(H�;H�](H9�s�1��l���f�H�u(H��H)�H�3H�](����f�AWAVAUI��ATL�fUI��SH��L9���H�oXH�U H�EH��H)�L9���H�]H�CH�K H)�L9���H�sH�H�H�qI�H�M�CL�cH+UH��H�KH���H�H��H�+H�}H��H�]I�]X�U�OH9�v6H��f.�H�	�qH9�w�H�;H�UH�ZH�QH�UH�*H�MH�iH��[]A\A]A^A_��I�L�eH��[]A\A]A^A_�f.�I�E@H��t���H��1�[]A\A]A^A_��M��$'I���M9�w�I����_M�������I��I��I9�w�I�u0H�L9���H�~H��tH�t$�H�t$H�H�~J�\�(J�D�(H���XL9���L���f�H9���H��H�H��H��t�L�L�H9�r	M�����C��H�VHFH9�HG�H�FH��t�H�C(H�H�U H�C�+����H�F(H��tWH�~H��tH�t$�H�t$H�F(H�~H��t(�HH��L9�r�f��KH��L9�sNH��H�H��u�H��t�L���H��H���l���I�D�xL�p �\���@A�A� ���H��H�H��B����H��H��H���f.�H��tH��H�<�t�H����L������H�N(H����SH���H��H��tH��1�H���H��H��[�f.�AUATUH��SH��H�GpH��t!f.�H�H�UpH�x�PH�EpH��u�H�}H�EpH��t&�H�}H��u�H�E H��t�H�H�U H�x�PH�E H��u�H�}8H��t�[�H�EH��t<H�@0H�xH��t�H�UH�EH�H��tH�PH�EH�@0H�xH��t�H�]`L�m0H�CH�I;m �II�}H��t�I�}M�EE1�I�U�!f.�H9���L�#I��H��H��tD�CH�H�pM��u�H����M�L�M�Q(L�H9�vM��HD�I�Y(H9�sz1�H��H��u�I�}I�}I�UH��t��DI�$L���I��M��u�I;m ��H��[]A\A]��H��wRM�L�I�q(H�3I�Y(H��uH9�vH��H��H)��8���f�M�M(L�I�](H9�s�1��\���f�I�u(H��H)�H�3I�](���f�I�E���H��L��[]A\A]���ff.����t
�����t��H��H�=�H�H�H���DAUATUSH��H��H�GpH��t!f.�H�H�SpH�x�PH�CpH��u�H�{H�CpH��t6��H�{H��u�H�C H��t f�H�H�S H�x�PH�C H��u�H�{8H�C H�C(H��t��L�c`H�ChH�C8H�CHL�cXI�D$M;$$��L�k0I�D$I�}H�I�,$H��t�M�MM�U1�I�U�fDH9���H�]H��L��M��tF�EL�EH�HM��u�H����I�t�H�~(H�}L9�vH��LD�H�n(H9�sx1�L��M��u�I�}M�MI�UH��t�H��t�H�+H���H��H��u�M�$$M�d$H��[]A\A]ÐH��wJI�L�H�q(H�uH�i(L9�vH��uI��H��H)��8���I�u(H�uI�m(H9�s�1��f����I�M(H��H)�H�MI�m(�����AWAVI��AUI��ATI��UH��SH��H�H��HD-H��u	H��tL�m@M����I�$H����I�|$H���*�I�\$0I�$I�T$0I�|$H����H������	H9���H��H�H��H��t�H�3H�2H9�r	H���3�C��I�T$ID$H9�HG�I�D$H������@L�e0I�$H���O���I�D$(H��tMI�|$H��t�I�D$(I�|$H��t%�P��t���S����H��H�H��u�H��t�� �H��H���B�@H�� H�C H���L�{(H�H�[H���H�CL�cXH���H���L�khH�C0H�CHH�CPHǃ�H�C`H�CpH�CxH�k(H��tyH�E0H�xH��tL�H�E0H�xH�EH�C8H��tH�S8H�PL�}H��H�k@H��t�M�>H��1�[]A\A]A^A_�H�EH�C8H��u�L�}H��H�k@��DH�C8H�C@�fDI�|$0I�T$0H����H��������fDM��t�A��H���[]A\A]A^A_��H��H�H��B�����H��H��H���	@H��tH��H�<�t�I�$���I�L$(H��븹�|���H���1��m���@��B�1���t
�f�H��(����t�H��(�f�H�
1�1�����uOH�=H�GP���u�H�1�H�|$���u�H�H�L$H�JH�
H�J �H�=�D$���D$H��f���ff.�f��=AVAUATUS�"NH���I��I��I��H��H����H�EH����H�}H�����H�]0H�EH�U0H�}H���<H������
�H9���H��H�H��H��t�H�3H�2H9�r	H�����C��H�UHEH9�HG�H�EH�������H�E(H��tGH�}H��t�H�E(H�}H��t"�P��t��S���EH��H�H��u�H��t�� �H��H�����@H�� H�C H���H�S(H�H�[H���H�CH�kXH���H���L�shH�C0H�CHH�CPHǃ�H�C`H�CpH�CxH�C(H�C8H�C@M��tuI�U1ۉ�[]A\A]A^�@����H��H��t1H�@����@H�}0H�U0H����H���=������M��t��A���@H�U �f�H��H�H��B�B����H��H��H���	@H��tH��H�<�t�H�E����H�M(H��빹���H���1�����ff.�f��+���ff.�AVAUI��ATI��UH��SH��0H�GXH�|$H��H�xH�D$H�@ �D$ H�<$H�D$(L�@�L�D$H9��>L��H��H�޿�����3H�$H�PH�$�H�T$H�$H�\$(L�bL)�H��H��L�H�BH����M�u0I�~H��t�M�M�V1�I�V�DH9��7H�+H��L��M��tG�CL�H�HM��u�H���PI�4�H�~(H�;H��uL9�LG�H�^(H9��1�L��M��u�I�~M�I�VH��t�H��t�H�]H���H��H��u�|$ ��I�uXH�|$H�V H+V�GH�FH��H���H�GH��H�8H��H�7L�H�~I�}X�VA�@H9�v2L���H��HH9�w�L�H�H�zH�PH�VH�2H�H�pH��0L��[]A\A]A^�f�H��wZI��H�q(H�3H����L9���H�Y(I��H��H)����f.�I�v(H�3I�^(H9�s�1����f�I�N(H��H)�H�I�^(�X���f�H������������I�E@H��t��Ѐ|$ uH��0E1�[L��]A\A]A^�DM�e0H�l$H�T$(I�|$H�UH��t	�H�UI�<$M�D$1�I�L$�$f�H9�sSH�]H��H����H��H��EH�pM��u�H��wcM��M�Q(L�UM��uH9�HG�I�i(H9�s51��fDH��wRI�4�L�N(L�MM����H9���H�n(H��H��H)��@M�L$(L�MI�l$(H9�s�1��b���fDI�t$(H�uI�l$(��I�<$I�|$I�L$H��t�H�������H�+H���H��H��u����H�Y(�!���H�n(�q���ff.�H���H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�H��$�H�T$�D$H�D$H�D$ �D$0H�D$�H���ÐH�~@�ff.�H�G@�ff.�H��ff.��H�G0�ff.�H��u�f�H9�tH�6H��u�1�ø�f.�H�wP�ff.�H�BHH��tSH�����H��H���H�1�[�DH�1��ff.�H��tKAUI��ATI��UH��SH��H��H�G(H��t4H�0H�w(H�S H�hL�hL�`H�H�C H��[]A\A]���� ���ff.��AUI��ATI��UH��SH��H��H�yHH��tyH�����L���H��t=H�{HL��H�����L���H��tH��H��L��H���H��1�[]A\A]�@L��H���H�{HL��H�����H����DH���H��H�CH�s���@ATI��UH��SH��H��H�yHH��t6L��H������H��tH��H��L��H���H��1�[]A\�fDH��H�t$�H�t$H��H�EH�DH��t;H�G(ATI��UH��SH��H��t-H�H�O(H�SpH�hL�`H�H�Cp[]A\�fD��� ���ff.��H��t{H�G H�O H��u�,@H��H�H��tH9pu�H9Pu�L�L�H�O(H�H�G(H�GpH�OpH��u�1�H��H�H��t%H9pu�H9Pu�H�H�H�W(H�H�G(���ff.�@H��t+H�G H��u
� H�H��tH9pu�H9Pu�H�H���ff.�@H��I���H��H��A��f.�H�=�T��@1��ff.�f�ATI��U��SH���H�S8L� �hH�PH�C8[]A\���ff.��;�ff.���ff.��K�ff.���ff.���ff.���apr_global_poolGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�CA�AD8�K�B�B �A(�D0��
(A BBBA������d�QB�B�B �B(�A0�D8�DP�
8C0A(B BBBG�
8F0A(B BBBE�7A�l
CF(@B�D�H �gDB4H\p0��A�D�G ~
AALoAA�&L�	B�B�A �H(�K0v
(D ABBID
(F ABBA,7B�A�D ��
ABHxL)B�B�B �E(�E0�E8�DP�
8A0A(B BBBIK
8A0A(B BBBKT
8C0A(B BBBH�&A�dH�RB�B�A �D(�D0�
(A ABBH�(D ABB0Kdf8HB�B�A �A(�G0�
(A ABBBd�<B�B�E �E(�D0�D8�D@)
8C0A(B BBBAq
8F0A(B BBBH��d0Y
C<�I�B�B �A(�A0��
(A BBBEHX\"B�B�E �D(�D0�D`�
0D(A BBBJ�
0D(D BBBF��G�����$&8L2J�XF�DhdG�E�D �D(�G0k(A ABBD����H0����8��B�E�D �D(�G0M
(C ABBE0�kB�D�D �G0r
 CABG4 TK�D�D �cABG���H ���X�l1�DL��(�-B�I�C �[AB�(<PdCP�.�Q=S_p~������@7���@����-�E�]�x�&��	��7�
)�@
&��p
R��K� @<��+;S`�p0�@"��p���� �0@&p%�2;H�db0�x����k�P T�� ��@!1�!�!4�!J�!-c�!t"�"� "�0"�@"�P"cleanup_pool_for_execfree_proc_chain.part.6psprintf_flushapr_pools_initializedglobal_poolglobal_allocatorapr_proc_waitapr_proc_killapr_sleepmemcpyapr_thread_mutex_lockapr_thread_mutex_unlockmallocapr_allocator_createapr_allocator_destroyapr_allocator_mutex_setapr_allocator_mutex_getapr_allocator_owner_setapr_allocator_owner_getapr_allocator_max_free_setapr_allocator_alignapr_allocator_allocapr_allocator_freeapr_pallocapr_pcallocmemsetapr_pool_destroyapr_pool_terminateapr_pool_clearapr_pool_create_exapr_pool_initializeapr_atomic_initapr_thread_mutex_createapr_pool_create_unmanaged_exapr_pool_create_core_exapr_pvsprintfapr_vformatterapr_psprintfapr_pool_abort_setapr_pool_abort_getapr_pool_parent_getapr_pool_allocator_getapr_pool_is_ancestorapr_pool_tagapr_pool_userdata_getapr_hash_getapr_pool_cleanup_registerapr_pool_userdata_setapr_hash_setapr_pstrdupapr_hash_makeapr_pool_userdata_setnapr_pool_pre_cleanup_registerapr_pool_cleanup_killapr_pool_child_cleanup_setapr_pool_cleanup_runapr_pool_cleanup_for_execapr_pool_cleanup_nullapr_pool_note_subprocessapr_palloc_debugapr_pcalloc_debugapr_pool_clear_debugapr_pool_destroy_debugapr_pool_create_ex_debugapr_pool_create_core_ex_debugapr_pool_create_unmanaged_ex_debug}���������������������������������+��������]�����������������������������������\�����������������1��������|�����������������V������������������������� ����������������������������������$�����������������m	���������	�����������������,��������h��������������������������E
!��������Z
#���������
$����������������6��������a�����������������������������$����������������q$����������������������������������h���������#��������V��������������������������E��������x�����������
��������������������
�'����������	�)���������*����������������+��������4��������:F��������b���������0��������S��������������������������c���������
��.����������������������������������-��������$��������?���������-���������7��������!��������Z7��������u:���������8���������;���������:���������<�������� :�������� 8��������9 <��������� !���������!?���������!�!!�����������������M�������� <P���@�8�L�`�t������ �P
�@
�p
4�L �@��`L0`@�p�� 0(@<pP�l��0��$P \� p@!��!��!��!��!��!"", "@0"T@"hP".symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @U"@�6 

&�",�"12�"@0�".I�"^�"xY@�@�
P* 	p1 Ehcharset.o/      1747905038  1000  135   100644  1704      `
ELF>h@@
��f.�SH����H��t�8u�[ÐH��H��[�ISO-8859-1GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx� 0,A�]
BG,0<apr_os_default_encodingapr_os_locale_encodingnl_langinfoapr_pstrdup

��������)
8�������� 4.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @<@p`
&|,|12|@0�.I�^�PY@�0
 	(Hhenv.o/          1747905038  1000  135   100644  1688      `
ELF>�@@SH��H���H��tH�1�[���[�f�H����H��������H���1�H���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�'A�V
IF<DNTDK'
01 P/apr_env_getgetenvapr_env_setapr_env_deleteunsetenv��������:
��������U�������� @0XP.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @`@�H	&�,�10�.:�O�hJ@�H	88
	p88Yerrorcodes.o/   1747905038  1000  135   100644  6808      `
ELF>@@
UH��SH��H����N~\��������/9
�T���
~d��
���t����HE�H��H���H��H��[]����;u�H��H��H���H��H��[]��09
)����H��H��H�����f.���9N��b��,N�`� ��&N�$����)N�������'N�C�����(N��HE��*���f���x����r������u���z���s�����t��HE��������*N�������+N��HE����fD���"N�����~}���$N�t�����%N��HE��[�����3N�����/N��P���-N�'�����.N��HE�����fD��!N��HE��������0N������1N��HE����fD��6N�$�����4N�������5N��HE��|���@���v�g�����w��HE��N���fD���;N�7�����,������<N������q��HE�����f.����������~�B`���|������}��HE����fD���7N�������8N��HE��~���fD����g��������HE��N���fD�����2�����)��������HE��������������������HE�����fDH�߾�H��H��[]�f�����fD����fD����fD��~���fD��n���fD��^���fD��N���fD��>���fD��.���fD������������
��������Could not perform a stat on the file.A new pool could not be created.An invalid date has been providedAn invalid socket was returnedNo process was provided and one was required.No time was provided and one was required.No directory was provided and one was required.No lock was provided and one was required.No poll structure was provided and one was required.No socket was provided and one was required.No thread was provided and one was required.No thread key structure was provided and one was required.No shared memory is currently availableThe specified IP address is invalid.The specified network mask is invalid.Could not find the requested symbol.Not enough entropy to continue.Your code just forked, and you are currently executing in the child processYour code just forked, and you are currently executing in the parent processThe specified thread is detachedThe specified thread is not detachedThe specified child process is done executingThe specified child process is not done executingThe timeout specified has expiredPartial results are valid but processing is incompleteBad character specified on command lineMissing parameter for the specified command line optionCould not find specified socket in poll list.Shared memory is implemented anonymouslyShared memory is implemented using filesShared memory is implemented using a key systemThere is no error, this value signifies an initialized error codeThis function has not been implemented on this platformThe given path was above the root pathThe given path is misformatted or contained invalid charactersThe given path contained wildcard charactersThe process is not recognized.Internal error (specific information not available)Error string not specified yetAPR does not understand this error codeDSO load failedEnd of file foundpasswords do not matchThe given path is absoluteThe given path is relativeThe given path is incompleteThe given lock was busy.Unknown hostNo address for hostUnrecognized resolver errorGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�DXA�D�G [
DAD_
DAD�
DAJ	X%apr_strerrorapr_cpystrnstrerror_rgai_strerror;
�H
�M
�_
��������t���������
������������������
��������
�
�!
8g
�~
��
8�
X�
��
8�
(�
P�
x�
8!
�8
=
8W
\
8q
X�
��
8�
9�
T�
8�
�
H�
8
�"
�-
�D
�I
8�
��
��
8�
H�
p�
8�
�
8�
8
�6
�;
8Q
"h
�m
8�
X�
���������
(�
�
�
o�
0�
�
@
�!
1
h;
�E
pO
� .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.8.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @X@��&�,�12��@2
�O0�
.X(m(`h@�	�8		�2�wgetopt.o/       1747905038  1000  135   100644  5152      `
ELF>�@@
D�GD�W@AT�G8U�o<SD��D)�D�L����D��L�_()�~@Hcу�Hc���H�I��H�I�T�M�d�fDH�2H�H��H��H�p�H�JL9�u�~C�K�Hc�Hc���H�I��H�I�T�I�\�f�H�2H�H��H��H�p�H�JH9�u�A)�A��~?A�J�Ic�Ic���H�I��H�I�T�M�T�@H�2H�H��H��H�p�H�JI9�u�[]D�O<D�G@A\�AVAUATA��USH�oH��t+H�G(H��I��I��H�8�H�{M��L��H�¾1���[D��]A\A]A^�DAUI���HATI��L��UH��S��H���H�L��I�$L�(H�P�@ H�@I�$�X$��H�@0Hc�H��H���H�S�H��H���H�I��I�$L�@(I�D��@H�H8�@@H��1�[]A\A]�ff.�f�AWAVAUATUSH���G ����H�_0�;��L�KL�O0D�#I��I��H�L$H��L�$E��D�gA��:��D��L���L�$H�L$H���n�x:�H�H�E0�8u�EE�}H��1�[]A\A]A^A_��G D�GD;G$}GL�O(Ic�I��H�_0�;-u3�{L�K�O���L�O0�{-tH�CL��I���6���@A��D�G�GH�G0��~H��[]A\A]A^A_���{u�EH�]H��t*A�>:t$H�E(H�8�H�}D��H��1���D�}E�}H���|[]A\A]A^A_��U�{�Bu|�E9E$��H�E0A�>:��H�]H��t�H�E(H�8�H�}D��H��1���D�}��A��-�>���A�E-H���~[]A\A]A^A_�DL�	H�E0�E�u���DH�u(H�H��H��B��E�e�}����AWAVAUI��ATI��USH��H��(D�O E����H�G0��G�G D�C8�{$E��t>9�}7L�C(Hc�I���8-t'�BH��f.�I��H���9-t	�‰C9��S@9��/L�s(Hc�M�<�A�?-����SA�oI�W@��-��@��u4�|�H��(H��[]A\A]A^A_����@H�W0�*@���-�F��t#9�tmH�F��H��9�tX�xH�ƅ�u�L�kA�|M��t%H�C(H�8�H�{A��H�¾1�A��H��(D��[]A\A]A^A_��A�,$�NH�B��tQ�zuHcC;C$���HH�S(�KH��I�EH�C0�.f�A�u5H�������C<A�~�C�f�I�EH�C0H��E1�����j���D�FI�GH��H�D$E��tf�H�uD�D$H��tDH��H�4$�H�4$H�|$H��H�D$���uH�D$L�L$D�D$J����t[<=tWH��D�EE��u��|L���U���L�kA�}M������H�C(H�8�H�{A��H�¾1�A�����E�$�u��t!�:=tQHcC;C$}6�PI�ƉSI�E���I�E�:=����}L��������}L������H�D$J�DI�E����W����%s: %s: %s
%s: illegal option -- %c
invalid optionmissing argumenterroneous argumentinvalid option character%s: %s: %c
%s: option requires an argument -- %c
GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�(J�D�D ��AJ8HKB�B�B �D(�A0�u(D BBB4��B�J�G �D(�F0�(C ABB��@B�B�B �B(�A0�A8�DP�
8C0A(B BBBDn
8A0A(B BBBHE
8F0A(B BBBDs
8F0A(B BBBFdT-B�B�B �E(�D0�A8�G`�
8D0A(B BBBIr
8D0A(B BBBI	K	$`�4?FNU @`g`-w~permuteserrapr_filepath_name_getapr_getopt_initapr_pallocstderrfprintfmemcpyapr_getoptstrchrapr_getopt_longstrlenstrncmp5��������G
~
��������������������
�����������������|��������'i��������u

�����������
/�*
'����������
Z�
s~���������������������������
6
sW
Gi
6 L�`� X`.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.str1.8.comment.note.GNU-stack.rela.eh_frame @�@��&�,�12�@2P'O0w.X�m��h@�x	`
	p�(wotherchild.o/   1747905038  1000  135   100644  3624      `
ELF>�
@@
H�H��tXUSH��H;z u�MfDH9x tH��H�BH��u�H��1�[]�DH�ZH�hH���������P1�H�+H��[]�1��H�л��ff.�@AVI��L��AUI���0ATI��UH��SL��������H�L�pL�hH�h M��tA�T$�P(H�H��H�߹H�H�P�[]A\A]A^�ff.��H�H���H�p H9�t�H�@H����H9x u�H��U�SH��H��H�8�H�H��t%H�r H9�u�DDH�p H9�tH��H�BH��u�H��[]�@H�ZH�h�������PH�+H��[]�H�л���f.�H�H��tI�H�x9u"H����H�@H�p �P1�H���fDH�@H��tH�xL�@9t�L��H��u�;N�DH�GH��tgU���SH��H���8H�t$�H�S9t#��uGH�s �������SH��[]�f.�H�CH�s 1��T$�SH��[]�@�����u�H�CH�s �¿�S�ff.�U��SH��H�=H��t@H�_���H��H��u�H��[]�H�% GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�<qM�A�D d
CAFaAAA��C ��8\tB�H�J �D(�D0�L(A BBB8��w�F�G }
AAE\
AAAJ���
�[ZW<�J�H�G0j
AAKYAAE��H0��(@2A�C�D gAAq$
K�tit������[� ��2other_child_cleanupother_childrenapr_proc_other_child_unregister.cold.0apr_proc_other_child_registerapr_pallocapr_pool_cleanup_nullapr_pool_cleanup_registerapr_proc_other_child_unregisterapr_pool_cleanup_killapr_proc_other_child_alertapr_proc_other_child_refreshwaitpidapr_proc_other_child_refresh_all��������k
�������������������

����������
��������8
H��������O���������
���������A���������������������������������������������������� `����� D�.symtab.strtab.shstrtab.rela.text.data.bss.text.unlikely.comment.note.GNU-stack.rela.eh_frame @�@�
&2,818
@0B.Ip^phY@�	�
��	�;�
hrand.o/         1747905038  1000  135   100644  2184      `
ELF>H@@
SH��H��H���fo$1�H��[�AUI��ATA�����UH��SH��f.�A���u�e�����uwH��L��D���H���t�H��xWt)I�H)�u�D��1��H����[]A\A]�f.�D���H��t;1��1��A��u������D���H����[]A\A]�A������/dev/urandomGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx� A�G VAL<�B�E�G �D(�D0W
(C ABBK
(C ABBA  �9JOUapr_os_uuid_getuuid_generateapr_generate_random_bytes__errno_locationreadcloseopen	��������Q��������f���������
���������
���������
����������������������������
�������� @ .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@��
&0,0120
@0=.Ik^p�Y@�0
�h	`Z�hstart.o/        1747905038  1000  135   100644  2416      `
ELF>0@@
��B�1���t�f.�H��(�����u51�1�H�|$1�����D$u)H�|$��H�|$��D$H��(���"N���{���ff.��-t�fD�ff.���apr_initializeGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�d0L
H8L`
;Ocv��������initializedapr_initializeapr_proc_mutex_unix_setup_lockapr_unix_setup_timeapr_pool_initializeapr_pool_create_exapr_pool_tagapr_signal_initapr_app_initializeapr_terminateapr_pool_terminateapr_terminate2����������������%
��������*��������/��������C
��������U
Z��������d�������������������������� <�P�d�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@`
&�,�12�@0.I1^8pY@h`
��		���hversion.o/      1747905038  1000  135   100644  1504      `
ELF>�@@
H�H�GH��f.���1.7.6GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0
 apr_versionapr_version_string!
 4 .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @&@�
&f,f12f@0l.I�^�@Y@0
��	� 8hcommon.o/       1747905038  1000  135   100644  1224      `
ELF>@@
�H��xH9VrHV1�H��fD�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�!!apr_mmap_offset .symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack.rela.eh_frame@!!a'a,0a.5�J�0E@���		��Tmmap.o/         1747905038  1000  135   100644  2760      `
ELF>�@@H�GH�W H�OH�JH�WH�O H�J H�GH�G H9�t1��@SH��H�wH��H�C������t�[��f�1�[�ff.��AWAVAUATU�SH��H����H�����~����n0����M��E��H��I���(L��I��H�T$�f�D��L����L�L$�@H�@ D�CI�E�EЉЃ�A��E�1��H���tVI�U�H�BI�E�L�8H�@L�`I�EH�@ H�8H���H����[]A\A]A^A_Ð�	��f�I�E��(��ff.�@ATI�Ժ(UH��L��SH���L��H�EH�X H�SL� H�EH�PH�SH�EH�B �H�CH�u�[1�]A\�f�H��H�?��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�dy�b
ECH<B�B�B �B(�A0�F8�DP�
8C0A(B BBBB(�^B�I�G �FCB�d&p6AF\v�^����mmap_cleanupmunmap__errno_locationapr_mmap_createapr_pallocmmapapr_pool_cleanup_nullapr_pool_cleanup_registerapr_mmap_dupapr_pmemdupapr_mmap_deleteapr_pool_cleanup_runE��������V	�������������������������

,
J��������y	������������������

�
����������
��������� @p����.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@�P	&@,@10@.:nOp�J@`	8�
	�hYinet_ntop.o/    1747905038  1000  135   100644  2688      `
ELF>@@@
H����L�OI��A�dH���W���cv\��M�C����f���H0A��A�)�f�ʉ�k�g��f��
)��A0��A�C�)ʃ�0M�XA�@.A�L9�u�A�@H���f�M�؀�	v���I��������f���H0���A�)��DH����1�H���f.�AWAVAUATI��USH��hH�T$H�$���m��
t ��a1�H��h[]A\A]A^A_�@�����1�1�E1���A���A�Df�����|�f���������u�¾H��H��u΃�������tA9�}A����A�������N�L�t$01�L���cfDL�h�:��u��uA����A����@Hcþ.�L��L�L���L)�H)�1��H�L���9�����u�I���f.�����?���D9����uH����A��D��H��������$���f�H��D��H����������f.�H�$H�t$L�����H��h[]A\A]A^A_�B�\=�:H�����`���H�P���u?�O�|$$������L��I�|$L��L)�H�P.�;���H���7���L���L�H�PD���u
�:H��H���L)�H9$r5H�\$L��H���H��h[]A\A]A^A_�fD����]����L���f���1�����%xGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx���Q|4rB�B�B �B(�D0�A8�D�h
8A0A(B BBBE]
8A0A(B BBBA�
8A0A(B BBBG��r+8?inet_ntop4__errno_locationapr_inet_ntopapr_snprintfstrlenstrcpy�	���������	���������
������������������
��������1	�������� 8�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @B@�
&�,�12�@0�.I�^��Y@�0
hP		�F�hinet_pton.o/    1747905038  1000  135   100644  2928      `
ELF>0@@
AWAVI��AUI��ATE1�U1�SH���D$L�|$DI��A�^���tK�޿�H��tbA�H-���P=�wsA���u�A��A��bI��A�^����u�A��~J�D$A�EH���[]A\A]A^A_�fD��.��@��tA��tA�G1�I���_����H��1�[]A\A]A^A_�ff.�@AWI��AVAUATUSH��H��(��t'��
tB��a�����H��([]A\A]A^A_�H��H������H��([]A\A]A^A_�fD�f�)D$��:��H�\$1�E1�L�l$H�$D��H��E����D�����H��t4H)��	Ł���v1�H��([]A\A]A^A_�A���DD����H���-A��:��E��u+H�<$u�H�\$L�,$뿐�NH����:�D���1��I�EH�T$ H9��z���f��H�\$E1�fA�mI��1��y���E��tI�EH�T$ H9��E���f��fA�mI��H�$H��tKI)�J�L(�H�D$M��
�#�H���1H��@�pH�q��H;$u�foL$�A�O���H�D$ I9�t�1�����A��.����I�]H�D$ H9������H�|$L��I�������g���1���������0123456789ABCDEF0123456789abcdef0123456789GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�\�B�B�E �E(�D0�C8�DPy
8F0A(B BBBGl8C0A(B BBB||5B�E�B �B(�A0�A8�G`^
8A0A(B BBBDO
8A0A(B BBBGj
8A0A(B BBBD�8 '6=�5Kinet_pton4digits.7113xdigits_l.7128xdigits_u.7129strchrapr_inet_pton__errno_location8
8=��������L8���������
 ����������
 �
���������
 ��.symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @%@��
&e,e1pC90�.B�W��R@�0
�h	H\�amulticast.o/    1747905038  1000  135   100644  3536      `
ELF>�
@@U1�SH��H��H�|$���uXH�|$H��tIH����H�H��tHH�PH��t�f�:
u�H�KHH�sPH3JH3rH	�u�H�x�H�|$���H����[]�fD1���ff.��AUATUH��SH��H��(H�FD�HM���LA��t&��A�)A��
tH��([]A\A]��E1�E1�#H��L�D$A������L�D$A��.D��D$H�E0H�L$D���oD$�oHL$(�oP T$8�oX0\$H�o`@d$X�ohPl$h�op`t$x�oxpI�@0A��$��o�$��oH�$��oP �$��oX0�$��o`@�$��ohP�$��op`�{�$��oxp�$�����~1�H��([]A\A]�fDA��tr��A��
�����H�B0E1�#A���oA��)D$H����H������D$ �{H�L$D��)A�����u����W���@�BD�D$H��t,�AD�D$�C��1�A�H�L$������t�1��<����D$��fD�D$ �x���H��(H�F�T$�@��t��
tG��H��(�D�F��A�H�L$1������1����u���H��(�f.�1��D$��!A��‹~H�L$�)�D$����I��H��H��H���#����f.�I��H��H��H���$���f.�@��H���!����ff.�@@��H���"���ff.�@SH��H��H�G�@��t��
tG��H��[�@�H�NDA�1�� ���1����u���H��[�f�H������{A�H�L$�D$��)�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�(�A�C�G0j
CAGLH=B�B�A �D(�J�o
(A ABBH
(A ABBG��D0^
Fm
K����(�A�G Z
AEm
AJ��=��%0?KVg`v��������find_if_indexdo_mcastdo_mcast_optgetifaddrsif_nametoindexfreeifaddrssetsockopt__errno_locationapr_mcast_joinapr_mcast_leaveapr_mcast_hopsapr_mcast_loopbackapr_mcast_interface
��������a��������m���������
��������\
��������i���������
��������

����������������
��������+�������� L����`�������.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @f@�	&�,�10�.:�O�0J@�	�	�

	��p
Ysendrecv.o/     1747905038  1000  135   100644  5440      `
ELF>@@@ATI��UH��S�G@H���� t�If�����u|�{H�UL���H���t�H�{(~H;ErrH�E[1�]A\����߉G@1�1�H�����t�5�����u�{H�UL���H���t��D��t#[H�E]A\�fD�K@ ��H�{(����ATI��UH��S�G@H����t�Yf��������{H�UL���H���t�H�{(~H;Er~H��H�E[�]A\%~�f.����G@1��H�����t�2D����u�{H�UL���H���t��D��t#[H�E]A\�fD�K@�v���@H�{(����AWH�F@I��AVA��AUI��ATM��USH��H��H�D$���H�ŋ��u9�{E�M D��L��L�D$I�$�H���t�I�$H��1�[]A\A]A^A_���uNH�{(~G1�1�H�����t�5f.��E��uЋ{E�M D��L��L�D$I�$�H���t��I�$H��[]A\A]A^A_�ff.�AWI��H�O AVA��AUL�o@ATM��USH��H���G �H�|$H�$�@��H�Ń�uY�{L�$M��D��I�$L���H���t�H�L$�y ��I�$1�H��u�{�~D�H����[]A\A]A^A_���u[H�{(~T�H��1���…�t�=D�U��uЋ{L�$M��D��I�$L���H���t�H�L$�y �w����
I�$�H�$H�D$�PB�p@H��f�����H�$1�I�$H���O����>���ff.�AVI��AUI��ATA��UH��S�����R�H�F1�H��H�Tf�HH��H9�u�E@�� t�Jf.�����u|�}D��L���H���t�H�}(~H9�wt[]I�1�A\A]A^�fD��߉E@1�1�H�����t�5�����u�}D��L���H���t��fD��t#[]I�A\A]A^��M@ ��H�}(����1��%���f�AWAVI��AUATI��UL��SH��H��(H�I�8���H�D$vI����M���LD�E1�A�F���+�C@L�l$�� tN��߉C@1�H��L�l$1��������H�EH��(��[]A\A]A^A_�@�����hA�t$�{L��H�M�A�����t�E�Ic�H;E�dA�V����I�vH�L$H��D�D$�D|$D�D$��Mc���1ҾH��D�D$�D�D$L�}1�E���P������D����������A�t$�{L��H�M�A�����t��S������H����������A�VI�6H�L$H�������H�t$A�NLc��������I�>��H��H�WH�Lf�H��H9�u�H�H9��W���H�u1ҾH������s�����t{�L$L�}1ҾH����L$�N���Mc�1ҾH��L�}D�D$�D�D$��E��~YH�{(�����K@ �
���f.�Mc�����H�{(�����u���H�E������@�~���L�}���L$�G���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�8�B�D�D �I
CBHN
IBG8X�B�D�D �Q
CBPN
IBG`��B�I�E �E(�D0�A8�GPG
8C0A(B BBBD_8A0A(B BBBH�BB�I�E �F(�D0�A8�GPn
8C0A(B BBBDLDB�E�E �D(�D0�i
(A GBBGN
(A IBBDL��B�B�E �B(�D0�D8�G`m
8C0A(B BBBE 	�*0K��[`��kr�B}����0���no_hdtrapr_socket_send__errno_locationwriteapr_wait_for_io_or_timeoutapr_socket_recvreadapr_socket_sendtoapr_socket_recvfromapr_sockaddr_vars_setapr_socket_sendvwritevapr_socket_sendfileapr_socket_opt_set!	��������7
��������n���������	���������
��������	��������
��������a��������q	���������
��������	��������&��������\������������������	����������������w��������������������������a	��������v������������������	�����������������f
����������	�����������������"��������K��������d	��������q	�����������������������������������5��������X�����������������	���������	�������� \�����H�0.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@�
�	&F,`  10`.:�O��J@P�	p
@
	���Ysockaddr.o/     1747905038  1000  135   100644  11720     `
ELF>�*@@
AVAUATI��UH��SH���zL�j0���^H��H��H��L���H���a�{
��B�D%��{
tH��1�[]A\A]A^��H�C0�%��=��u�H��I����{XL��I���L9�u�H���1H����������!� ��t����€�D�H�qHDΉ�@�H��H)�J�D)L9���J�D-H���%H�P�����������E���A�6@�p���4�����A�L�f�L��"���H�C0��������P��������x����I�����L�mL���L��H��H�P�����H��H��L���H)�A�|�����H���[]A\A]A^�H�4$H��	H�p���H��I�|6�H�|2�H)��I)փ���s�����1҉փ�I�<6H�<09�r��X���A�6�p��A�L��L��B���UH��SH��H��H�;Hcv(�Hcs(H��H�EH��H��[]���ff.�@�wf�w@f��t��f�Wf��f�GB��t1��
t��tG�fDH�GH�G(.H�G0H�H�G �f�H�GD�G(H�G0H�H�G �f�H�GB�G(lH�G0H�nlH�G �f�AWf�AVAUATI��USL��H��h)D$0H�|$f�L$)D$@)D$P�T$4�D$8���;�D$0 H����L�t$(H�T$01�L��L���E1��ʼn�����L��H�T$0L��L��d$0���Ņ��fDL�t$(M����E1��DM�v(M����A�F���u�H���H�xH��I��Hǀ�H��1�H)�������H�I�]I�}@A�VI�v��T$A�vL���M����I�GI�EM�o8M�v(M��M���r���H�|$(�M��uOfD�.N�Bf�H����H�L$(H�T$01�L����Ņ�����������09
)��H��h��[]A\A]A^A_�fDM��tL��H���I�EH�D$L�(�Z����L����L�t$(�D$0!�L��H�T$01�H��H�D$�L�D$���?���D��L���D$0�H�L$(H�T$01�H������9���f.���(���:������@1������ff.��UH��SH��H����uX�s8H�R��u�K4��uH�U1�H��[]Ð�B ��{H�r@H�� ���xeH�SH�C4�BBf��f�B���uc�C<H�R ��t��B ��{H�r@H�� ���xUH�S �C<�BBf��f�B�s���������i���H�S�Z����H�H���[]�D�����1���H�S �"���AWI��AVAUI��ATI��UH��SH��8H�H��H�1�f�2L�D$�M�t�M9��p�L��H��H��I9��S��DQu�I9��@I9�v	��:�jM��M)�A�?[I�IL�L$H�����]L��H�L$�H��H����I9�H�L$L�L$��H�ʾ%L��L�L$�L�L$H���0H�S�H9�tmI��H)�H�|$H�pM)�H�S�I��L�L$�L�L$I�EH�|$L��I�w�H�T$ �
H�EH�����1���tGH�EI�E1�fA�$H��8�[]A\A]A^A_�f�H�|$L���H�E1�H��8[]A\A]A^A_�fD�
1�L����P�����w�fA�$H��81�[]A\A]A^A_��I9��z����
H�{1���P������[���fA�$L�s��`���I������AUD��M��ATUH��SH��H��H���tVH��@�Dž�@��@�ul��tg�;/��D��A����A��uZH��M��D��H��H��[]A\A]������uH��u���u�H��t�;/tp��H��[]A\A]�H���[]A\A]�M��D��
H��H���j�����t1����@�M��D��H��H���B����
���[���1�떐L���H��H�xH��H��Hǀ�H��1�H)�������H�H�UH�zBL�*�l�L�eH��L����H�nI�D$H�Ef�P@H�PB�@(lH�P0H�pH�E�P(�P$H��1�[]A\A]�ff.��H�H����AVI��AUI��ATI��U1�SH���p��H�E8H��H�sH��tI9�tI;utxL���H�EH�sH��tI9�tI9utHL���H�E�S�sL�eH���H�[8H��tH��H��L��H��u��H��I��I�H�@H�E�I�H�sH�@H�EH��u��f�[1�]A\A]A^�D1��ff.�f�AVAUI��ATUH��S��H�� �I����E��
�������۸L�t$�u D�H��L��E1�H�}@E1��S���XZ����I�E���t'���1�)Á�09
H�� ��[]A\A]A^�fDA�$�����À�
��@H�E1�I�E��@D�EHE���]����}L���R����}P���E���H�E0��L�t$��$�L��@�D$�D�H��E1�E1�SH�|$�Y^���+����H�}L���H�EI�E�/�������À�
����fDATUSH��0H����H��H��L�L$1�A�H�L$0H�T$H���A�ą�uHH�D$H��t>�@H�}H��f��f�E�H�EH�D$�@f�EBH��0D��[]A\��H��0A�D��[]A\�H��0A�D��[]A\�ff.�AUATUH��SH��H��D�g$D�n$E9�t3�C@�U@f��tef��u
f��
��1�H��[]A\A]��H�v0H�0Ic����u��{
�E��1҃�
u�EX9�u����f�1�f��
u�H�M0D�E��u��y��u��y��u�H�{0Ic�H�q��������l����H�K01��1���U����Q���J����y���=���H�}0Ic�H�q�������� ����SX��
�L���1��H���ff.�f�U1�SH��H�o0H��t,HcW$��w#H��H����¸��t1��{
tH��[]�@�M��u�U��u�}��uދE9������AW�AVAUATUSH��(����yH��I���:I��H��I���H���pL���$�f�H��
@fv�I�$@M�4$I�^H�������A�V���WA�
I�$M�����9
� ��L��HE�H�t$�
H���H�T$�:�/I�$H�QH���&H9��f�AI�$H�� ��H�x�H�qH��H��L�D������H��I9�u�H����H��H��H�D�Hc���L��A�yf�A��	�A��D��H��u��A�y���H��H������7M�����0NH��([]A\A]A^A_�f.��H�H���
H�����.t���DQu����]����A�F�������A�~��������@I�$H�PL����¸1N���j���I�$�9�]���H�qH�A�P!H��H9�u�H��(1�[]A\A]A^A_��H���H������H��H�t$H���A1ɨt	�
���t�<
f�<H���t�
�A�FA�F�T$�҈T$�,��T$H�|$A�H��A��H�u�DV������H��H��DVtf�H���H��DVu�<.t{���U���A����K���1��
�=��4���D��L��A��H����AFH��ANA�FH��A�N����j�����A�NI�$A�FA�H�q���f��H����A�����@��1҃�у�H�t
H�t9�r�H�L$H�4H����1�H�q�8���1�1��@�F��tHH�V0�
��u�r��u�z��u�?ty1��fD��
�t�D�?
t+�f.�1��?u�FD#G;G�����f�#O;Ou͋J#O;Ou‹J#O;Ou��B#G ;G�����f��B#G;G����Ã
�0NuH�W0�������t�ATUH��SH��H��H�����uf�I�ċ��tH��[]A\�fD�
H�t$H���H�T$H���.N�:u�A�$��u,H�Q�H���w�KX�f.��CXH��1�[]A\�f��.N�f��
�0NueD�GXE��t\AUATI��UH��SH��H��H��t$�H����{XH��I���H��t,M�,$1�H��t�SX�UH��[]A\A]��������GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�XB�B�B �D(�D0�D@D
0C(A BBBH9
0F(A BBBA$x1A�D�G [DA��L��B�F�B �B(�D0�A8�G��
8C0A(B BBBG4A�D�G `
AAB�
FAFx</B�E�B �E(�D0�D8�Dp]
8F0A(B BBBJW
8A0A(B BBBGc
8C0A(B BBBIl��B�H�A �D(�G0D
(M ABBLa
(A ABBAD
(F ABBA�(C ABB<(�R�E�E �D(�C0��(C BBBF�����`hzB�B�E �A(�D0�I�y�S�H�A�k
0C(A BBBG�G�K�A�L��B�A�A �G�n
 DABHG
 JABDG JAB83B�B�A �D(�G0q
(A ABBI(XpA�C�D y
AAEd�B�G�B �B(�A0�A8�D`�
8A0A(B BBBK�
8C0A(B BBBH��@�b�A�D �J0\
 AABGO
 CABCDD�V�B�D �D(�G0z(A ABBI����H0������+BPWfnz1��P���������	!�/5CJYgn���`
���`z��������
3��pP3:`�L�bq~��call_resolver.constprop.1inaddr_any.7891apr_sockaddr_ip_getbufapr_inet_ntopstrlenif_indextonamememmoveapr_cpystrnapr_sockaddr_ip_getapr_pallocapr_sockaddr_vars_setgetaddrinfomemcpyfreeaddrinfoapr_pstrdupapr_itoa__errno_locationapr_socket_addr_getgetsocknamegetpeernameapr_parse_addr_port__ctype_b_locmemchrapr_pstrmemdupapr_inet_ptonstrtolapr_sockaddr_info_getapr_sockaddr_info_copyapr_pmemdupapr_getnameinfo__h_errno_locationapr_getservbynamegetservbyname_rapr_sockaddr_equalmemcmpapr_sockaddr_is_wildcardapr_ipsubnet_createstrchrapr_ipsubnet_testapr_sockaddr_zone_setif_nametoindexapr_strtoi64apr_sockaddr_zone_get/������������������
��������h��������w�����������������$��������I��������t���������������������������������A��������y����������������������������������'��������;��������Q��������k�������������������������1��������i��������������������������0��������d��������������������������� ����������������C!���������!���������	���������	��������

���������
$���������
���������
���������
��������	$��������x&���������'���������'��������������������������
)��������>
���������
+��������`+���������+��������
+��������D���������.������������������ ��������!��������� ����������������i �����������������+���������!��������B1��������K��������v2����������������
��������I�������� |�P���@���,`
l`�� �
\��P�`H�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @Q@�!�
&�,�1�90�.B�W��R@�(�
h�
	H� *asocket_util.o/  1747905038  1000  135   100644  1640      `
ELF>h@@U�H��SH��H��f�D$�D$H�|$ f.�1�H�T$�H�|$���t�=wt^��u�|$�.NtH��[]�@�D$t�L�D$H�L$�H��H�D$H�|$0�=~t ��u��E��EH��1�[]��E1��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�<�A�I�J�U
AAEN
CAA�apr_socket_atreadeofapr_pollapr_socket_recvfromB���������	�������� .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�0	&,10.:<O@XJ@�	��
	�3Ysockets.o/      1747905038  1000  135   100644  8944      `
ELF>�@@USH��H���G0�o��t
H�G�xt#�C���������t
�k��H��[]�H�x���DATE1�UH��SH��PH���f�H�߾�@@ @0@@H�EH��H�uH�xH��H��H�Hǀ�H��L��H)�������H�H�V��H�EH�PH�8H��H�uH�xH��H��H�Hǀ�H��L��H)�������H�H�V H�EH�P H��@<[]A\��U��SH��H���W1҉OH��H�{ ��1���C@H��[]�f�SH������u�C����[���[����G�1���AWA��AVA��A��AUA��ATUSH��H����t[A�����L��D��EщT$�N����T$L�#D�����A�D$L�#A�T$��yK��H��[]A\A]A^A_�fDL������D��D���
H�+�L�#�E�
A�D$��xQD��D���L�����H���H�@(����H�8H���@D�H��1�[]A\A]A^A_�f�D��D�����A�D$L�#A�T$���:����@H����1҃��u����H���ff.�@H��H�?��UH��SH��H��@H���V�����t@�{H�]t1�f�{Bu�E4H��[]��H�H�E0H��1�[]Ð��H��[]�f�H����1҃��u����H���ff.�@AUI���ATI��UH��SH���A�|$H�t$@H�T$ �D$ ������H��L����4���A�L$�t$@�I�}����I�UfoD$@�L$ H�B �ZH�B(�����B<H�R@@foL$PHPfoT$`P`fo\$pXpfo�$���fo�$���fo�$���fo�$��H ��I�D$�o�oHJ�oP R �oX0Z0�o`@b@�ohP�H@jP�op`r`�oxpzp�o�����o�����o�����o����I�]H�SH�*f����f��
��H�S f�����JBf��f�JA�L$4��t�C4A�D$At�K@A�T$8��uCHcP$H�x0����t-�CD�H�;H��H���H���1�[]A\A]��C8�����H���[]A\A]�H�JDH�J0I�]H�S �L����o "�ohj�op r �ox0z0�o`@b@�ohPf�x@jP�op`r`�oxpzp�o�����o�����o�����o����I�UH�RH�JBH�J0I�UH�R H�JBH�J0I�]�����H�S ���fDH�JHH�J0I�]H�S �t���ff.�AVL�v@AUI��ATI��USH�����H�ŋ����A�T$ A�}L����Ã��t�IcT$$I�|$0������I�Ef�xtFf�x@tNHcP$H�x0����tA1����u�����jD�H��[]A\A]A^�f�x@A�E4u�M�e��A�E8�fD��r���_���I�}(�T���1�1�L�����u�A�}L�D$H�L$���D$��Å����D$���	����a���f�I�} �AoD$@A�E<A�D$ A�T$G@�AoL$PA�t$OP�AoT$`W`�Ao\$p_p�Ao�$����Ao�$����Ao�$����Ao�$��G ����~����E���ff.�@�G�1���ATUSH�ZHH�H��t,I��H���@H�H��tH�{H�����u�H�CI�$[1�]A\�f�AVI��AUI���ATI��USH��H�?�H�;L��H���L�mH�EH�CHH�EH�kHM��tH�;L��L��L���[1�]A\A]A^�ff.���F�1���UH��SH��H��H���L����S�s�K H�}�*���H�H�EH�s�H�@(�����PH��t}H�@�P H�x@�H�EH�sH�H�QBf��f�QH��tgH�@ �P H�x@�H�EH�H �QBf��f�Q�@D�H�8H��H���H��1�[]�f�H�H�sH�H4H��u��@<�UH��SH��H�H��t'H��@4H�H8�U�PH��1�[]�H��H���=���H�;1ɺ�����H�H�@(�����ff.��H��ff.��USH���GD�Ł�um�tH����[]�DH���1������tQ��{���1�����t8H�;H�޹��KD�H����[]��H����[]�f���(H��[��]ËWD���u	��%u
�f�SH���1������t8���{���1�����t�cD�����H�;H��H���1�[�[��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�(KA�A�G t
AAA(H�B�D�D ��AB$t7A�C�G iAA�)A�W
HF�`�,B�E�L �E(�A0�A8�GPN
8A0A(B BBBGj
8C0A(B BBBJ4!D\L<`nA�D�K n
AAHR
CABKAA�!D\L�5B�J�D �D(�G��
(C ABBD^
(A ABBD@�B�F�E �D(�A0�D@�
0A(A BBBDL(`GB�A�A �}CB8�dB�E�J �D(�A0�D(C BBB�(��A�D�J �
CAJ(dA�D�D g
CAD4HH�A�A�D X
CAFP
CADI
CACKAC�ya�M
BFKP�@7-�)Bn�Ufmx����,���!�� �0n�!'.�5@HO�Zb}�	� 	G��p	d���	��	����
d@#P�:@Vq�ysocket_cleanupalloc_socketset_socket_varssocket_child_cleanupgeneric_inaddr_any__errno_locationunlinkapr_pallocapr_sockaddr_vars_setapr_socket_protocol_getapr_socket_createapr_pool_cleanup_registerapr_socket_shutdownapr_socket_closeapr_pool_cleanup_runapr_socket_bindapr_socket_listenapr_socket_acceptaccept4memcmpapr_socket_connectapr_wait_for_io_or_timeoutgetsockoptapr_socket_type_getapr_socket_data_getstrcmpapr_socket_data_setapr_pstrdupapr_os_sock_getapr_os_sock_makememcpyapr_os_sock_putapr_socket_pool_getapr_socket_inherit_setfcntlapr_pool_cleanup_nullapr_pool_child_cleanup_setapr_socket_inherit_unset'��������3
��������E��������f��������������������������X��������e������������������
����������������%
��������W���������
��
���������������������������
��������'
G���������
������������������
�����������������
����������
���������
��������1
��������P!��������f
k���������
����������
��������"��������8#�����������������P	&���������	���������	(���������	��������?
+��������l
+���������

�
���������/���������/���������
0�
�1���������
��������/��������8/��������I
W1��������a
��������,�������� LPx@������8�P d0����P	d 	�p	��	��	�
8@LP��.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @i@��	&�,�n 10�.:�O��J@��	��
	h��Ysockopt.o/      1747905038  1000  135   100644  4976      `
ELF>p@@S1Ҿ1������߀��1��1҃��t��[Ð�[����DS1Ҿ1������߀���1��1҃��t��[Ð�[����DSH��H��H�G(H��xGH��xH��tuH�s(1�H��[�f��G@u�H�t$�}�����uڃK@H�t$��fD�W@H��x(��t#�H�t$������u��S@H�t$������S@닋S@���S@�DS��H��H�� �҉T$���҉T$����:~H��@�<��������N������H�� [�������������@���uȋW@����9�te����b�m�����u��D$�S@���b��1��S@듁�����`���j����W@��	��9���1�H�� [Ã������<����W@���9�tڋA�H�L$�	��������D$�S@���=��1��S@���A�H�L$��)����tD�D$�S@���G��@1��S@���f��A�H�L$�������2�����H�� [�D�W@��9������A�H�L$�
��D$�D$����t��S@�L$�Ѓ��t�Ѓ��C@1�� ���D�WB��9�������A�H�L$�������Y����D$�S@������1��S@����@�1�A�H�L$����������D$�S@���&��1��S@�(���fD�W@����9������A�H�L$�	�����������D$�S@���:�΀1��S@�(���D�W@����9�������A�H�L$�������_����D$�S@������1��S@����D�W@����9��_����A�H�L$�����������D$�S@���z��1��S@�x���D�W@��
��9������A�H�L$������������D$�S@�����1��S@� ���D�W@��tA��1��W@����@�A�H�L$�������P���1��}������W@����D�A�H�L$�����������D$�S@������1��S@���fD�濉S@�p���D�����S@�]���f.�������������A���fD��S@�0���D��S@� ���D��S@����D���S@����D���S@��D�����S@����f.���S@����D��S@���DH�G(H�1��fD�G@!�9������1��ff.�S1�H���H���H�T$���x�T$1������H��1�[���H��[�ff.�ATI��USHc�H�����u"1�H��L����H��t&��[]A\��A�$�[�(��]A\�DA�$�$��@A��H�W��zt�DH���������@�D�D�Ɖ����1���y��H���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�;A�m
BF<;A�m
BF \�A�G ]
AJ4��A�I0]
AH�
AA�
AF�
�$�EA�N b
CDKA4\B�D�A �f
ABHK
EBF@K\n;	@;+��B �U`�
w��E��P\����K�soblocksononblockfcntl__errno_locationapr_socket_timeout_setapr_socket_opt_setsetsockoptapr_socket_timeout_getapr_socket_opt_getapr_socket_atmarkioctlapr_gethostnamememchrapr_socket_perms_setfchown
	�������� 	��������1
��������M	��������`	��������q
��������g
���������
���������
���������
��������;
���������
���������
��������2
���������
���������
��������:
���������
���������
����������������9
��������^��������q���������
������������������
�������� @@`�� �����PD�.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@�p	&;,;10;.:iOpXJ@8�	�	(
		��Yepoll.o/        1747905038  1000  135   100644  6496      `
ELF>�@@�����ƒ�@��E‰ƒ� ��E��H��H�GH�8�1�H���f.�H���H�1�H���ff.�f�AVI��AUI��ATI��USH��~"H���H��S㥛� H��H��H��H��H����A�VA�~HI�vP��Ņ�xo�wt[1��"@�8�8���L��f�FA�ԅ�u=H��9�~5I�VPH�[H��H�pA�Ft˃~u�I�NH9Nu�I�~��[]A\A]A^�@�[]�A\A]A^�AWI��AVAUATI��USH���H�$H��~"H���H��S㥛� H��H��H��H��H��I�GH��A�WH�p�8��Å��4�w��I�GE1�E1�1�H�D$�;fD�oIc�A��H��HOA�8�oHI� ���f�AI��D9�~SI�HK�DmA�OL�G��M��I�@L�HID���t��xu�I�WH9Pu�H�|$���f�E�4$E��tH�$1�H��tI�GHH�@H�A�W��uLI�GH��uH�p@H�H@H9�t2H�pHH�x0H�>H�p@H�x8H�~H�p8H�x@H�>H�pHH�p8H�H@H�HH��u,H����[]A\A]A^A_��A�W�(��u��fDH�x���DH�x�A�WI�GH���h����ATI��UH��SH��H�F�H�L$�D$H�D$�PH�GH�8����ËE���uE������H�}HH�W H�G H9�t)I�L$H9J u�*f.�H9J tH�H9�u�uAH����[]A\�H�BH�
H�H�H�JH�HH�G@H�H�GHH�BH�GHH�H�WH��t�H��H����[]A\�f�H�EHH�x�H�}HH�W H�G H9�t�u���P����E�����h���f.�H��H�F�H�H�L$�D$H�D$�P�H����%�DH���F�HH�t$H�L$���D$H�F��P�1҃��t��H���D��H�����f�ATI��UH��SH���F�WH�D$���D$H�GH����H�t$1�I�T$�8H�L$��R�A�ą�u?�U��u&H�EHE1��H�H H�H�H(H�KH�H(H�H�X(uIH��D��[]A\�D��UD� ��u�E��t�H�EH��H�H0H�H�H8H�KH�H8H�H�X8t�H�x�H��D��[]A\���uKH�H0H�P0H9�tVH�X0H�SH�H�
H�H�KH�J�Ao$H�\$C�AoL$K ����fDH�x�H�EH�f�H�}�0�H��H�H�CH�EH�f�AWAVAUA��ATI��UH���S��H��������PL��A���I��H�EHD�������E�>H�4[L��H��H���H��L��I�FL�uH�I�FE1�A��u(H�EHH�P H�P H�P(H�P0H�P0H�P8H�P@H�P@H�PHH��D��[]A\A]A^A_�fDH�EH�D�0��fDI�~L��1��A�ƅ�uL�uH�S���f�D���H�EH�ff.�ATI��UH���S�����x&�EH��L��H�4vH���[H�EP1�]A\�fD�[]�A\�epollGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0DQHDNH`�B�E�E �D(�A0��
(A BBBEF(A DBBH��B�E�B �B(�D0�A8�DPt
8C0A(B BBBD@�&B�D�D �D0�
 CABD@
 CABJ<;D nTND v
FK@tnB�D�D �D0}
 DABFE
 DABDH�B�B�B �E(�D0�I8�F@�
8D0A(B BBBG4LB�D�I �a
GBGFAD '@;`�L0�^&r@;��N��n�@�`L� 0�`0	
���/EOZh��Pget_epoll_reventimpl_pollset_cleanupimpl_pollcb_cleanupimpl_pollcb_pollimpl_pollset_pollimpl_pollset_removeimpl_pollcb_removeimpl_pollcb_addimpl_pollset_addimpl_pollset_createimpl_pollcb_createimpl_cbimplcloseepoll_waitapr_poll_drain_wakeup_pipe__errno_locationapr_thread_mutex_unlockapr_thread_mutex_lockepoll_ctlapr_pallocepoll_create1apr_thread_mutex_createapr_pollcb_provider_epollapr_pollset_provider_epoll+��������H�����������������
��������!�����������������1�����������������������������������G�����������������	��������j����������������������������������i�����������������
��������*��������_��������w����������������������������������*��������D��������r��������������������������
  `(�0@8`@@HP
``@h�px0� � 4 L@d`�0�@@X�x��@`.symtab.strtab.shstrtab.rela.text.data.bss.rela.rodata.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@��&�,�6� 1@�P>2�M0�.V�k�8f@ 
0
	0�(ukqueue.o/       1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5poll.o/         1747905038  1000  135   100644  5344      `
ELF>�@@�����ƒ�@��E‰ƒ� @��E‰ƒ�@�� E����G;GtHL�GH���o��H��H��IP�oNJI�H��H�V�R��V��f�Q�G1����f.�D�GE��t;L�_HL�N1�M�SI�R0M;Ju�f.�H�� L9J�t���AD9�u��fD��AVSA�X��_D9�si��)�H�L��H���Af�M����o��O�4M�4�H��L��oIJL9�tL�NM�SI��K��L9Iu��oL9�u�1�[A^ù1��v������f.��G;Gt8H�WP����L��H�V�RA��V��fA�PH�WXH�4ʉG1�����f.�D�OE��t6L�WXL�F1�I�I�RL;@u�H�2H��L9Ft���AD9�u����E�Y�D�_A9�vg��A)�I�H��I��I�L9At:SL�OP�ƃ�I�I��I��I9�tH��I�L9Au؃oI9�u�1�[�@�oI9�tH���1�ù1��DAWH��AVI��AUATUH��SH��H���H��~H��S㥛� H�H��H��H��H��I�NHA�v��H�9������w��A�F����1�E1�M�fE1�I�VHD��H�
�|�f��t=H��HBA�Ft�xtg�oD��A��H��HJ�oHI���f�AA��E;nr�D�;E��tH��t^I�FH1�H�@H�EH����[]A\A]A^A_�f�I�NH9Hu�L��������0���1��fDAUH��I��ATI��UH��SH��H��~H��S㥛� H�H��H��H��H���uH�}P��������wti�E1ۅ�u$�o����L��f�FA�ԅ�uD��;]sMH�UP���|�f��t�H�UXH�4�Etǃ~u�H�EH9Fu�H�}��H��[]A\A]�fDH��1�[]A\A]���H��[]A\A]�ff.���u{AUATI��H��UH��S��H���H�4�H��H��I�D$HI���H��H��I�EM�l$H�M�d$HH��H��I�E�I�D$H��1�[]A\A]�fD���f.�U�FH�H��H��AVH���I��AUI��ATA��SH)�H��~WD�F�H�G1��8D��uKH�x��<��xD�NH�� ��f�|�H�~L9���H���8��u�H�P�R����1��H��~"H���H��S㥛� H��H��H��H��H�щ�H���A���~XE��~-A�D$�H�KI��L�D���9I�� ���H��fA�E�I9�u�1�H�e�[A\A]A^]��Ic��x�����wt���H�e�[A\A]A^]�pollGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�)0V$D�U�A�xBA��l�F��w�tE�H�JB�E�E �B(�A0�D8�G@�
8C0A(B BBBJX��B�H�D �D(�D0�
(A ABBGD
(C ABBDK(A ABB<X�G�B�G �D(�K0R(C ABBG����0�;A�P
F�E�E�D��
Hj)0V��1pD�FT��g�Jy������0�@0	
������;�get_reventimpl_pollset_addimpl_pollset_removeimpl_pollcb_createimpl_pollcb_addimpl_pollcb_removeimpl_pollset_pollimpl_pollcb_pollimpl_pollset_createimpl_cbimplapr_poll_drain_wakeup_pipe__errno_locationapr_pallocapr_pollapr_pollcb_provider_pollapr_pollset_provider_poll���������������������������3����������������������������������,��������@��������T��������=�����������������

@p���(@�H0P�X�h 40H�pp�������\���.symtab.strtab.shstrtab.rela.text.rela.data.bss.rodata.str1.1.rela.rodata.comment.note.GNU-stack.rela.eh_frame @�@0
 
+&@P0
162J p E@��
R0�.[�p��k@p�
�	�	`zpollcb.o/       1747905038  1000  135   100644  3136      `
ELF>@	@@SH�G`H��H�@ H��t��Cu1�[�H�{�1�[�AWI��A��AVI��AUATU��SH��H�E��tE��A��tA����@����H�A�H������hL��L�$�����D$A�����L��D��I���@H��D�x�hL�0H�X`�L�$=�t��uh�D$����H�{ t��L��L��L�$�L�$M�)H��1�[]A\A]A^A_��H�H���P����+�����H��[]A\A]A^A_�@A��t�@��u�H�H��tЉ�L��D��L����u�I�]`L�$�O���I�](I�}I�UL�$H�����u�I�E`H��L��PL�$���-����ff.�E1��X����H�G`�`f�H�G`�`f�H�G`�`f��Gu
���@H�w ��f�H�G`H�@(�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�-A�[
DL`<�B�H�E �B(�A0�C8�DP�
8C0A(B BBBHa
8A0A(B BBBE�����	-+0�@Ze{���������
-0	pollcb_cleanupapr_poll_close_wakeup_pipeapr_pollcb_create_exapr_pollcb_provider_epollapr_pallocapr_pool_cleanup_nullapr_pool_cleanup_registerapr_pollcb_provider_pollapr_poll_create_wakeup_pipeapr_pollcb_createapr_pollcb_addapr_pollcb_removeapr_pollcb_pollapr_pollcb_wakeupapr_file_putcapr_pollcb_method_name%��������u
������������������
�

��������+��������g
�����������������*�������� @0��������0.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @9@0�	&y,y10y.:�O�J@ �	�(
	�D�Ypollset.o/      1747905038  1000  135   100644  3760      `
ELF>p@@
SH�GPH��H�@ H��t��Cu1�[�H�{�1�[�AWI��A��AVI��AUATA��USH��H�E��t'D��A��tA����A����A����H��H����D��XL��L�$�����D$A���D��L��D��I���@H��D�xL�0D�`H�XP�L�$=�����u�D$����H�{ t��L��L��L�$�L�$M�)H��1�[]A\A]A^A_�fDH�H���J����&���H�H���2���������H��[]A\A]A^A_�@��t�H�H��t�D��L��D��L����u�I�]PL�$�>���I�](I�}I�UL�$H�����u�I�EPH��L��PL�$�������f�H�GPH�@(��H��H��tH�B(�f.�E1�������GuH�GPH�x tH��H�?���1��D�Gu
���@H�w ��f�H�GP�`f�H�GP�`f�H�GP�`unknownGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�-A�[
DL`<�B�H�E �B(�D0�A8�DP�
8C0A(B BBBGy
8A0A(B BBBE�	���+�,-,0�B]h~�����	 -0+AV`iw�����pollset_cleanupapr_poll_close_wakeup_pipeapr_pollset_create_exapr_pollset_provider_epollapr_pallocapr_pool_cleanup_nullapr_pool_cleanup_registerapr_pollset_provider_selectapr_pollset_provider_pollapr_poll_create_wakeup_pipeapr_pollset_method_nameapr_poll_method_defnameapr_pollset_createapr_pollset_destroyapr_pool_cleanup_runapr_pollset_wakeupapr_file_putcapr_pollset_addapr_pollset_removeapr_pollset_poll%	��������������������������


��������;��������S����������������������������������
H
M��������z�������� @0���� �0�`��0�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@�h
&�,�12�@0�.I^ @Y@
�
`�		�hport.o/         1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5select.o/       1747905038  1000  135   100644  4376      `
ELF>
@@D�GD;G�L�OH�oD��H��I���oNHH�F�P�	������v@��t/�ҍB?A��I�A��A��B�����?H�D)�A�I��M	�@��t3�ҍB?A��I�A��A��B�����?H�D)�A�I��M	�����rt-�ҍB?��I�����2����?H�)�H��I	��A9��}A���A��1�D�G�f���f.�D�OL�FE��t7L�_H1�M���I�R0M9Bu��H�� L9B�t���AD9�u��fD��UA�i�SA�X�oA9�v^��)�I��H�I��H���7����o��H��L��oIJL9�t"L�FM���I�� K�
L9AuƃoL9�uޅۍC?��I�������H���?I��)�H�����H��H!H!��H!�A�����~9�t
1�[]�D��A���1���1��!���ff.�AWE1�AVAUATI��UH��SH��H���H��x4H��4�ׂ�CH��I��H��H��H��?H��H)�H�$Hi�@BH)�H�t$H�EHH��$H�t$H��$��o )d$�oh)l$ �op )t$0�ox0)|$@�o`@)d$P�ohP)l$`�op`)t$p�oxp)�$��o���o���o���o���o���o��)�$��o���o��)�$�)�$�)�$�)�$�)�$�)�$�)�$����o��o��o� �o�0�o�@��)�$�o�P�o�`)�$ �o�p)�$0)�$@)�$P)�$`)�$p)�$�����+�w�'�}���u1�E1�E1�A��WDM	�M��t<�oD��H��H���oZ1�f�QYH��tf�IM��tf�IA��A��D9m��H�uHD��H��H���zH�Jt�Et
H9M���IM���ɍy?A��I�A��A��D�����?D)�I��Hc�L��̐L���L��M��L!�M!�L�L��0����oD��H��H����oJf�qI�0���@��H�Ę[]A\A]A^A_��E���E�4$E�H��t�H�UHH���H���@H�}�����DA�$1���ff.��AVAUATUS�˃�������H��A��H�׾�I���A�H��H�EHL�����H�H�EHL��H������H�H�EHL��H�����H�L�uHD��L��H��Adž�H���H�mHH��L��I����H���1�[]A\A]A^�@H�GH�[]A\A]A^�f.�H�GH��[]A\A]A^�selectGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�(02T�E��
AFN��L\tB�E�B �B(�D0�D8�J��
8A0A(B BBBH\��B�B�B �A(�A0��
(A BBBEN
(A BBBKN(A BBB 2&`t8��L0	
�Qb}�impl_pollset_addimpl_pollset_removeimpl_pollset_pollimpl_pollset_createimpl__errno_locationapr_poll_drain_wakeup_pipeapr_pallocapr_pollset_provider_select1��������i�������������������������p������������������ `( 4 ``��.symtab.strtab.shstrtab.rela.text.rela.data.bss.rodata.str1.1.rela.rodata.comment.note.GNU-stack.rela.eh_frame @�@�
+&@�
1 62 J@0 E@�x
R0p.[�p�k@8`
��	p
��zwakeup.o/       1747905038  1000  135   100644  2400      `
ELF>`@@AUH��I��ATI��H�rUSH�ӺH��H����Ņ�tH����[]A\A]�fD�M�,$�fA�D$H�A�D$I�D$H��x1�����tU�����H��x1�����t9H�C��x1�����t!�����H�C�x1������a�����(H��[��]A\A]�USH��H��H�?H��t7�H�{H���1�H��t
�H�C��D�H����[]�H�{1�H��t��H�CH����[��]�DSH��H��H�D$�f.�H�|$uH�;H�T$H�t$���t�H��[�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�H�B�H�H �A(�O0O
(C ABBG�(A CBB0hkA�A�G w
CAD\CC�JA�J�}A�5;L�kgvPJ�apr_poll_create_wakeup_pipeapr_file_pipe_create_exfcntl__errno_locationapr_poll_close_wakeup_pipeapr_file_closeapr_poll_drain_wakeup_pipeapr_file_read#��������n	���������	���������	���������	���������
�������������������������4����������������� l��P.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@��	&�,�10�.:O�J@�H	�h
	(�Yz_asio.o/       1747905038  1000  135   100644  616       `
ELF>�@@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26).shstrtab.text.data.bss.comment.note.GNU-stack@@@0@.%nn5apr_random.o/   1747905038  1000  135   100644  5704      `
ELF>�@@
H�H��tH9�u�+DH9�tH��H�BxH��u�1��@H��xH�@xH�1��H������H����AVE1�AUI��ATI��USH��H�G`�@DH�rH)�H�L��K�|5L)�H9�HG�H��I��H�C`H)�H�C`M9��}H�kXH�S@H��u�H��H�K8H�C@H�sHH�PH��HQ�PH�C@H�sHH��PH�C@H��H�C@H�sHH�PH��PH�C@H��H��PH�C@H�sXH�@H�C`�X���fD[]A\A]A^���ff.�@ATI��UH��SH��H��H��L$H��H�I�$H��H�PH��HQ�PH�H�t$�H��PH�H��H��PH��[]A\�ATUH��SH��H�7�H�WH�O8L�G@�G H����SH�C��t7��H��H��H�f.��@H���@�H�@�H9�u�H�C1�H�C H��H�HH�C0 H�4	H���H��H�S8L�bH��H��H�C(H�C@L`L���L��1�H���H�S8H��H�CHH�C@L�bL`L���L��1�H���H��H�CPH�C@H�p��ct�H��H��H�CX��H� @H�ChH�H�C`�CpH�CxH�[]A\�fDAWAVAUATUSH��H�H��t`I���CtE�>L�c8L�k@H�kPL��L���D��<HEkHH����H�SHH9�tD��L��L�������k$H�C`H�[xH��u�H��[]A\A]A^A_��AU��ATUSH��H���H��H���H��I���H��I���M��L��H��H��H���H��H��[]A\A]�fDAWAVAUATUH��SH��H���I��I��E1�E1��B�H��sC�'��SH�M(H��H9��H9��=E�eM��M9����] H��H��H]���E ;Eu�E �C�p9ss�H�}��H�3H��H��t�SH���H���CH��p�6�S�f�������H�ME1�H��H�EH�H�xJ�4aH�?H��PH�EH�3H��L�P�CH�M��La��L9�w�H�M(�C�#���f�H�E�@H;E0sH��[]A\A]A^A_�@�EtL�eP��<H�E8LEeHH��H�E8H�M@L��H�PH��HQ�P�E��tXH�EE1�A��fD��t
D��D����}$t2A��D��H�M8H��H�H�ϋPH�0�QH�EA�V�D;Ur�H�U@H�E8H�rH��L�P�E$�Ut���E$��u>;Ehv9���Ut������H�E@H�U8H�}PH�uHH�RHP��E$�Ut�Ep������ElEp9E$�����MtH�E@H�U8H�}HH�uPH�RHPH��[]A\A]A^A_��1�����������GttH�����1�H���f.��<N�f.��GttH���a���1�H���f.��<N�f.��G$�gt��Gp�D�Gt��<�%<N�ff.�@�Gt��<�%<N�random/unix/apr_random.cp->bytes < g->rehash_sizeapr_random_add_entropyGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�H<0�K�E�E �D(�A0��(A BBBH�����,p]B�D�D �G0G AAB(�ZB�A�D �KABD��B�B�B �B(�A0�A8�D@p8A0A(B BBB4ZB�G�A �A(�G0~(D ABBdL�B�B�B �B(�A0�D8�D@0
8A0A(B BBBE0
8A0A(B BBBF�&JK�&JK��HP�,P];	T[�Zkv}�����Z����&.�&H[ s@random_cleanupall_randomapr_random_bytesmix_pid.isra.0__PRETTY_FUNCTION__.4999memcpyapr_random_initapr_pallocmemsetapr_pool_cleanup_nullapr_pool_cleanup_registerapr_random_after_forkapr_random_standard_newapr_crypto_sha256_newapr_random_add_entropy__assert_failapr_random_secure_bytesapr_random_insecure_bytesapr_random_barrierapr_random_secure_readyapr_random_insecure_ready��������B
������������������i��������v������������������������������������
�
������������������!�����������������������������������������������������������������������7���������
	�
�
�������������������������� 4PtP����P������ @.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.comment.note.GNU-stack.rela.eh_frame @Q@��&�,�12�3@�H0�.Qf a@8 	8
�	
�Xpsha2.o/         1747905038  1000  135   100644  5736      `
ELF>�@@fo
fof�H�G G(WG8GHGX�ff.��H��t�f��ff.�@AW1�A��/�BAVAUATL�g(USD��_D�wD�G�oD�oD�WH�|$��WL�d$�� f�D��E��D��A��E��D��A��A��D�H�D$���A���E!�A�D�L(��H����1����1����D!�D1��D��A�����D�D!�A�D���
1�D���
1Љ�D1�D!�1�C�<8�D�H��@�g���L�d$�D�T$��D$�i���-fD�4�A��D�l$�D��A��A�É�H���t$�D�lj�H�ʃ�E��D��D��A������1�q
��D1�E��E��E��D��A��
A����
D1�D�Q�A��D1�A��O�<�D�QA!�A��G��ED�։�A�7A����A��D1�A��A��A1׉���D!�D1�A��D�A��
��T$�T$��D1�A��A��
A!�A1�D��1�!�D1�D�E��H��@����H�L$�ADYYDAyiDi[]A\A]A^A_�f�H���AUATUH��SH��H���H��H���H�G I��H����?u]I��H��?�I�D$�H��L�l@f.�H��H��H��@�H�E L9�u�A��?M����H��[]A\A]�@�@)‰���H�|(I9�����rzH�L�GI��I��H�H�D�H�D�L)�I)�׃��r��1��ƃ�M�2M�09�r��HU H�I)�H�u(H��I���I��?�+����^���fD��������t�����t��D�f�D��DH�M(D��A��scA����E��tA�U�U(�tD��A�D�f�D�I��Le H��[]A\A]��L��I���Le H��[]A\A]�DI�EH�u0H��H�E(D��I�T�H�T�H)�A�I)̓��r���1҉у�I�|
H�<9�r��{������D��D�����A�U�U(D��A�D��D��R���������ff.�ATUSH����H��H��H����H�F L�f(H��H��H�H�V ��?���P���D(���8����@��L��H���f�C(I�D$0AD$AD$ H�S H�S`L��H���1�@�ʉ�TH��H�� u�H�{H�1�H��H�C`H)��Kh���H�[]A\��f�F(AD$AD$ I�D$0�F(��D�8H�L(1�)Ѓ�s]������T������I�����1�f�D��;���@�@��)�H�t(�������1������9�r����fDH�q��H�H�D�H��H)�ȃ��������1҉у�H�<9�r���������D�����������SH�� H����H��H��t_H��H���H��H��f��H��H��H�D$ �׃�@����@����@�~��V�H9�u��C@H�� H�C@[�H�WH��H��H�H��H�G`H)�H�׃�h���H�H�� 1�[ù�����ff.�SH��H��H��pH���M���H��H��H���H��H���H��p[�random/unix/sha2.ccontext != (SHA256_CTX*)00123456789abcdefcontext != (SHA256_CTX*)0 && data != (sha2_byte*)0apr__SHA256_Endapr__SHA256_Finalapr__SHA256_Updateg�	j��g�r�n<:�O�RQ�h��ك��[�/�B�D7q����۵�[�V9��Y��?��^����[���1$�}Ut]�r��ހ�ܛt�i��G��Ɲ�̡$o,�-��tJܩ�\ڈ�vRQ>�m�1��'��Y����G���Qc�g))�
�'8!.�m,M
8STs
e�
jv.��,r��迢Kf�p�K£Ql���$�օ5�p�j��l7LwH'���4�9J��NOʜ[�o.htoc�xxȄnj�����lP������xq�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�40@DB�J�B �B(�E0�A8��0A(B BBBp�UK�B�A �D(�D0w
(A ABBE�����H0����j
(A ABBHT
(A ABBF,��B�A�A ��
ABI(,�A�D0j
EAp
CA X2A�J�eA4` 3�80Qj	
�@�`��U����������2apr__SHA256_Init.part.0sha256_initial_hash_valueK256__PRETTY_FUNCTION__.3297__PRETTY_FUNCTION__.3307__PRETTY_FUNCTION__.3325apr__SHA256_Initapr__SHA256_Transformapr__SHA256_Updatememcpy__assert_failapr__SHA256_Finalapr__SHA256_Endapr__SHA256_Data
\
l�
�[
�������������������0���������

0�
�
���������>��������n���������

�
�
������������������-'-z

�
�
��������������������������� 4@H`���0�\�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.str1.8.rodata.comment.note.GNU-stack.rela.eh_frame @�@p&,12>@2P3O�� W0 
.`N
uP
xp@��
�@
	(sha2_glue.o/    1747905038  1000  135   100644  2008      `
ELF>�@@H��H�w H����H� ��H� ��U�(H��SH���H��hH���H�H�C H��H�CH�CH�C H��[]�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0	D	(XPA�I�D AA	 	&8K\0Prsha256_finishsha256_addsha256_initapr__SHA256_Finalapr__SHA256_Updateapr__SHA256_Initapr_crypto_sha256_newapr_palloc?��������O��������V em
����������������%�������� 4H \0.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@X�	&�,�10�.:�O��J@`	ph

	�}xYshm.o/          1747905038  1000  135   100644  5912      `
ELF>@@SH��H�w H�{(H�t����tH�{(1����t1�[�����u��[��DH�{(H�3[�ff.�H�(t)H��H�w H��1҃��u����H��������AWL�~AVI��AUI��ATUH��SH��H����H�Ͼ0I���H��L��H�(H��L�h�L�{ I��L��H�C(��GH�|$��Ņ�tH����[]A\A]A^A_�fDH�t$H�|$��Ņ��H�s H�|$��Ņ�t	����H�s D�D$E1�1����H�|$H�C��Ņ�u�H�CH�S �H��H�;H�H���H�C�I��R����H�Ͼ0�E1�A�����1�H�(�!�L��L�hH��L�x H�@(�H�CH���t6H�S H��H�;�H��1�H�P��H�C�I��������(����@H�|$�H�{(H�3����D�+���ff.��ff.�H�G(H��tH�7H���@���f�H��H�?��AUATUSH��(H���H��I���0H��H���H��H��H�I���I�ع�H��I�D$(�H�|$��Å�tH��(��[]A\A]�@H�t$H�|$��Å�u�H�|$I�t$ H�T$H�D$��Å�u�H�t$H�|$��Å���I�t$ D�D$E1�1���H�F�I�D$�H�|$I�D$��Å��^���I�D$I�<$�L��H��I�D$�M�e�1���f�H��(���[]A\A]�fDH�|$�I�|$(I�4$����ff.����ff.�USH��H������H�;H�޺���H����[]��H�G�ff.�H�G�ff.�L�G(M��tOU�Љ���S��H��L��H�����t��H��[]�@���H�{(�����u�H��[]����f�H��ff.�����f.����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�$UA�n
AP
HHD8KaH\�B�F�E �E(�A0�D8�DPZ
8C0A(B BBBG����L�eB�B�A �A(�DPY
(C ABBE�
(H ABBGH$\)A�A�G [CA��4�^J�G�L T
AAEZAAD����U`8&-4EU��do{�������p��
��,A�eP^0p@)�p����^������
shm_cleanup_ownershm_cleanup_attachmunmapaccess__errno_locationapr_file_removeapr_shm_createapr_pallocapr_pstrdupapr_file_openapr_os_file_getapr_file_truncmmapapr_file_closeapr_pool_cleanup_nullapr_pool_cleanup_registerapr_shm_create_exapr_shm_removeapr_shm_deleteapr_shm_destroyapr_pool_cleanup_runapr_shm_attachapr_file_readapr_shm_attach_exapr_shm_detachapr_pool_cleanup_killapr_shm_baseaddr_getapr_shm_size_getapr_shm_perms_setchownapr_unix_perms2modechmodapr_shm_pool_getapr_os_shm_getapr_os_shm_put	��������$
��������1	��������;��������t	�������������������������������������������3��������K��������w������������������
�
���������������������������
$
-��������A��������V��������b���������
��������������������������;��������^��������s���������������������������
�
`�������������������������U
`\ ���������$������������������%���������&��������Q����������������������������������� H``��p��������L0`@�p�������.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@�
�	&V,V10V.:�O� J@8�	��
		��Ywaitio.o/       1747905038  1000  135   100644  1576      `
ELF>(@@SH��H��tv�_(�G���D$�����f�D$��~$�����Mb������f�����u#�ھH�|$����t޹w��t~1�H����[�f��^(�F�����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�$�A�D n
CJ�-apr_wait_for_io_or_timeout__errno_locationpollA��������Y	����������������� .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@hH	&�,�10�.:�O@J@�	@�
	02�Yproc.o/         1747905038  1000  135   100644  13576     `
ELF>�1@@
H���=�H�5L��H��H�
�1���H���@SD�ˉ=�H�5L��H��H�
��1�[��ff.�SD�ˉ=�H�5L��H��H�
��D$�[�1��ff.�UH��SH��H��H���H�xH��H��Hǀ�H��1�H)�������H�H�UH��B@H�Bt����H��[]�ATA��U��SH�������t<�������D�H�CH�H�{��H�����tO[]A\�f.���uH�GA�����u@A��uH�C ���uZ��u�H�C0[]A\�H�{���u�A�����t�H�H�s H�{D�����u�H�{����s������t�H�H�s0H�{(������R���H�{([]A\�@�����fDUH��SH��H��H�H��tK�1�H��t��H�tL�����H��tR��tNH�{H�H��tgH��H��[]�f�H�{ta�1�H��t�H�H�CH�{���t
H��[]�fDH�{�������H��H�{H��[]�fDH��H	�u�H�H�sH�{���u�H�{H��[]�ff.�f�UH��SH��H��H� H��tK�1�H��t��H�tL�����H��tR��tNH�{H�H��tgH��H��[]�f�H�{ta�1�H��t�H�H�C H�{ ���t
H��[]�fDH�{ �������H��H�{H��[]�fDH��H	�u�H�H�s H�{���u�H�{H��[]�ff.�f�UH��SH��H��H�0H��tK�1�H��t��H�tL�����H��tR��tNH�{(H�H��tgH��H��[]�f�H�{(ta�1�H��t�H�H�C0H�{0���t
H��[]�fDH�{0�������H��H�{(H��[]�fDH��H	�u�H�H�s0H�{(���u�H�{(H��[]�ff.�f�SH��H�?�H��H�C8[����D�w@1��f.��wD1��f.�Sf�H��G���xt��r[�D�[����H�߉��q[�f�H�wh1��f��wp1��f.�1��ff.�f�SH��H��H��tH��H�H�t$���u �{x�t
H��[�@�T$�SxH��[��Ct����H��[�SH��H��xH����t�Cx����[�AWI��AVM��AUATI��UH��SH��H��XH��H�D$(L�L$E�HpH�D$(HD�I�@H�GI�@(H�GI�@H�GE��t7I�x8H��t������LA�F@�����A�<$/�H�=�D$$L�-��H�=tzM��tu�L�����udH��t_H�}H��tVD�E����H�}1�H��t���95},�
H�T$$L��1���D$��t�D$$f��D$�A���� ��H�=t0H�H��t$H�=H��t�D$��tH�t$$1����I�~H��t
����I�~ H��t
���bI�~01�H��t
���=H��X��[]A\A]A^A_�@M�nM��tL����L��H���M�n M��tL����L��H���M�n0M��tL����L��H����I�FH��t'�x����[��t1��I�~��I�F H��t$�x������t��I�~ �I�F0H��t$�x������t��I�~0��1��I�~8H��t���������u:M���M��t.fDA�NxA�VtA�uI�}A�U��t=�ugM�mM��u�A�~x��}A�~t�t
�����I�vHH��tx1����tm������I�^hH��t��H�|$�0�ӿ�������L����������f.������@I�vXH��t�����x���I�v`H��t�����]���I�vPH��t�	����B���A�F@A��A���>H�D$0H�EH�D$8H�D$H����H��A���E�lD��I��J�|��H��u��}H�|$Ic��H�uH�D$H����L�mI��fDH��H�t$I���H�t$L��H��H���I�A� I�u�I��H��u�H�D$A�G�H�D$@H�D$HA�ND���/A�V@����H��H�t$0��I�~h�Y���L�|$L��1�L���H���H��L���0A�Vh�)���H�=�J���H�H���:���H�=�,����t$��� ���H�t$$L��1������������v���A�~x����e���I�^hH���������H�|$�0�����D����fD����fD��q���fDA�~t�������I�^hH���@�����H�|$�0���(���f.�A�VD������������H��L������f�������1�����@������H�t$0���F���@�?~����H��������H�D$H�D$@�����uQH��L���������u1H��H��L���������������5������ÿ��L�|$�m���I�^hH��������H�|$�0�����AUI��ATI��UH��SH��H��H�D$LD�H��H�D$LD�1ۅ��Ã��f�����uO�}��H�t$���x�tn�T$�E�у�tA�q�.N@��~��������A�E�uA�$H��[]A\A]�f.���A�E�uA�$H��[]A\A]øv��f.����������D��t+~��t4��uH�W`1�����u�H�WH1��DH�WP1��f�H�WX1��f�AUI��ATA��UH��� SH��H��H�?�H���L�hD�`H�hH�H���H��1�[]A\A]�����change of working directory failedsetting of resource limits failedsetting of group failedsetting of user failed/bin/sh-cexec of '%s' failedGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�LDG4EA�yPEA�{$l`A�D�O IAAD�
B�D�C �y
ABKy
ABDd
ABIH��A�D�G A
DANo
AAG\
HAKdAAH(�A�D�G A
DANo
AAG\
HAKdAAHt�A�D�G A
DANo
AAG\
HAKdAA�A�T��$NA�a
FF
JU,@T0hMA�N [
AEK
ADKA�A�[L��B�E�E �B(�D0�D8�G��
8C0A(B BBBEL�B�E�D �D(�D@�
(A ABBKX
(A ABBAXlG8�MB�E�D �I(�G0i(C ABB8 10@(d ���x	�L��PE��E�`%0P
D\s`������`��`�`)�B�Z�Nchy������ M
p$0��@GNYk�������������� &60�DLd G{pMglobal_lve_no_maxenter_valueglobal_suexec_pathglobal_lve_ptrglobal_lve_enter_flags_function_ptrglobal_lve_leave_function_ptrglobal_use_grouplve_min_uidno_fileapr_lve_environment_initapr_cpystrnapr_lve_environment_init_groupapr_lve_environment_init_group_minuidapr_procattr_createapr_pallocapr_procattr_io_setapr_file_pipe_create_exapr_file_inherit_unsetapr_procattr_child_in_setapr_file_dup2apr_file_dupapr_file_inherit_setapr_file_pipe_createapr_procattr_child_out_setapr_procattr_child_err_setapr_procattr_dir_setapr_pstrdupapr_procattr_cmdtype_setapr_procattr_detach_setapr_proc_fork__errno_locationgetpidapr_random_after_forkapr_procattr_child_errfn_setapr_procattr_error_check_setapr_procattr_addrspace_setapr_procattr_user_setapr_uid_getapr_procattr_group_setapr_gid_getapr_proc_createaccessstrcmpapr_atoi64apr_file_pool_getapr_unix_file_cleanupapr_pool_cleanup_killapr_pool_cleanup_for_execapr_file_closeapr_signalchdirgeteuidsetrlimit_exitstrlenmemcpyexecveapr_psprintfsetgidsetuidexecvpexecvapr_proc_detachapr_proc_waitwaitpidapr_proc_wait_all_procsapr_procattr_limit_setapr_procattr_perms_set_register4
 ,$(-��������5��������?��������V4[
 b,l$x}�������������������4�
 �,�$�����������������������������������������������������������������3�����������������������������������<�����������������������������������<�����������������������������������<��������h"���������&���������'���������(���������)��������8.��������|0���������2��������"#2,?L
 T3��������m�4������������������4�$�&���������#��,u5��������z
6�7���������5���������
6�7���������5���������
6�7���������8���������9���������:�������� 	9��������)	:��������M	9��������V	:��������b	;��������p	<��������~	=���������	=���������	>���������	'��������
'��������

($
?��������9
2��������Q
'��������o
>���������
>���������
>���������

/�

7�
@����������������M@��������`A���������

/�B���������

:�C���������'���������#	+I=��������ZD��������t'��������y

�:���������:���������:���������E���������'���������

%
F��������6
G��������C
G��������V
G��������f


/k
H���������
4���������
H���������
B���������
I���������
I���������
I���������
I��������'��������
q'���������K�����������������H�������������������������O�������������������������O�������������������������O�������� 8PT�p��P�`,`x`�`�����0�DXl �p��0\p �p.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.8.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@!�
&x ,�< 12�J@2�NO0.XFmH�h@/	h	h�1wprocsup.o/      1747905038  1000  135   100644  2584      `
ELF>�@@
S�������t~��ub�H����H��tZH����H��t?H����H��1�H��t[�D������t!����u��[���1������H�
����/forkunable to fork new process
r/dev/nullwGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�$�A�q
F^
J�$,3:?PU\apr_proc_detachchdirsetsidstdinfreopenstdoutstderrfork__errno_locationexitperrorfwrite
		��������
����������������#
#(
%-��������9
��������>
/C
%H��������T��������Y
/^
%c��������y���������
���������������������������
����������
��������������������������� .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @�@X
&,121@0G.Iu^x@Y@X
��	�cphsignals.o/      1747905038  1000  135   100644  3760      `
ELF>p@@
S�H���H�߾�H�߾�H�߾�H�߾�H�߾
�H�߾�H�߾�H�߾[�f�H���?�1҃��t��H������H�����f�S��H��@H�|$H�4$�H��$�H���DŽ$� �H�������xH��$�H��@H��[�ff.���ff.�@���xHc�H���ff.�SH��H��H�|$��	H�|$��H�|$�H�|$��H�|$�t���@H�|$H�t$��|$�Ӄ�u�H�Đ1�[�ff.�H��H���H���)���H��1ҿ�H�Ĉ�f�S��H�ĀH�����H���H��1�1��H��[�DS��H�ĀH�����H���H��1ҿ�H��[�unknown signal (number)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�wA�q8.DT
HK XTA�I�ED|� �uA�J�fC�.G�f�+A�F�bA .A�F�eAw�.%*;�TFR\l ��@u����.���+�� .remove_sync_sigssigdelsetapr_proc_kill__errno_locationapr_signalsigemptysetsigactionapr_signal_initapr_signal_description_getsys_siglistapr_signal_threadsigfillsetsigwaitapr_setup_signal_threadpthread_sigmaskapr_signal_blocksigaddsetapr_signal_unblock
	��������	��������$	��������1	��������>	��������K	��������X	��������e	��������������������������������������������!
0Q��������`	��������o	��������~	������������������������������������������������������������+��������5��������D��������s	�������� <�\��� �@���� .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @N@��
&�,�12�@0�.I�^� Y@0
�
��		�hthread.o/       1747905038  1000  135   100644  5480      `
ELF>h@@H�w�gf�H����UH��SH��@H��H���H�EH�xH����tH��[]�@H�uH�߹�D$���D$H��[]���@��H��@���ff.�f�H��H��H�t$�1��|$��H��s�f.�H����H����AVI��AUI��ATM��UH���(SH��L���f�L��@H�@ H��H�H�H�BH�H�xtQL�pH�;H��H�EHE�L��1�1�L�o���t[]A\A]A^�f�H�H��[�]A\H�yA]A^�@[�]A\A]A^�f��ff.�1�H9�����H���w H�?�1��f.�UH��SH��H��H�FH�t$H�8���u�S �UH��[]�f�H�GH�8�@�ff.�H���H�	��H�FH�1��fDH��t[ATI��UH��SH�H��H��tH�h1�[]A\��(H���f�@H�@ H�L� H�h1�[]A\���"N�f.�SH��H����H��1�[�f��ff.�H��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0	0D]A�D�O0]
AAEbAAx�&D \�	�	\��B�E�E �D(�I0�m
(A BBBCG
(F BFBIA(F BBB,@	TD$h.A�D�G0_AA�����
8�fG�D�D �R
ABDmABH���0A�\L`	!6 ]LWi�����&��	"<�	Ys���������	�����.) ;J0[i@}�P��`
�pf���dummy_workerthreadattr_cleanuppthread_attr_destroyapr_threadattr_createapr_pallocpthread_attr_initapr_pool_cleanup_nullapr_pool_cleanup_registerapr_threadattr_detach_setpthread_attr_setdetachstateapr_threadattr_detach_getpthread_attr_getdetachstateapr_threadattr_stacksize_setpthread_attr_setstacksizeapr_threadattr_guardsize_setpthread_attr_setguardsizeapr_thread_createapr_pool_create_expthread_createapr_os_thread_currentpthread_selfapr_os_thread_equalapr_thread_exitapr_pool_destroypthread_exitapr_thread_joinpthread_joinapr_thread_detachpthread_detachapr_thread_yieldpthread_yieldapr_thread_data_getapr_pool_userdata_getapr_thread_data_setapr_pool_userdata_setapr_os_thread_getapr_os_thread_putapr_thread_once_initapr_thread_oncepthread_onceapr_thread_pool_get5��������E��������`

i
n�������������������������3��������m���������
������������������	!��������������������������	�����������������������������������������������������(#��������1%��������D'��������T)��������.�������� 4H |���������0�D�X�l�� �0�@�P�`�p4�Pd.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@�
p	&T,T10T.:�O�pJ@�	��
		x
'Ythreadpriv.o/   1747905038  1000  135   100644  2760      `
ELF>�@@ATI��H��UH���SH���f�H��H�xI�$H�[]A\��SH���~�H�1�[�ff.�f�H���~H���f����H���H�	���F�1���H��t[ATI��UH��SH�H��H��t�U�P1�[]A\�f�H�׾�f��UH�L� �P1�[]A\�f��"N�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�(8B�G�I �^ABHA�Qdx���8�fG�D�D �T
ABJcABJ���8)<@Vj`��p������"�7�fapr_threadkey_private_createapr_pallocpthread_key_createapr_threadkey_private_getpthread_getspecificapr_threadkey_private_setpthread_setspecificapr_threadkey_private_deletepthread_key_deleteapr_threadkey_data_getapr_pool_userdata_getapr_threadkey_data_setapr_pool_userdata_setapr_os_threadkey_getapr_os_threadkey_put��������H�����������������4	��������j
��������t�������������������������� L@h`|p��������.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@��	&V,V10V.:�O�J@��	�
	�LhYtime.o/         1747905038  1000  135   100644  3944      `
ELF>(@@
H��SH��Hc�H��4�ׂ�CH��H��H��?H��PH��H)�H�Hi�@BH�|$H�|$H)։3H�t$��tE�H�D$H�CH�D$H�CH�D$ H�CH�D$(H�C�D$0�C$H�D$8�C(H��P[����f�Hi�@B1�H�7�H��1�H���Hi$@BHD$H���U1ɉ�SH��H�������k(H��1�[]�f�S1�H��1������C(1�[��H���1����1�H���f�LcVHcNA�$NA����H�ףp=
ף1�A����H)�L�IH��LI�H��H��I��I�H��H��H�H��?H��H��H)�H)�L�L�JH��IH�H��L��FB���H�I��\���H�@HcFH��H��H��H)�HcVH��H��H��H)�HcVH��H��xHi�@BHcE1�H�H�D���f�S���uHcV(Hi���H[�fDH��4�ׂ�CL�H�>H��H��H��H��?H��H)�Hi�@BH)�I�xH�6H��H��?H��1�H��H)�I��@H��V��V�P�V�P�V�P�V�P�V�P�V�P�V �P�V$�P HcV(H�P(1��ff.�f�H�Hi@BHBH�1��ff.��H���W�P�W�P�W�P�W�P�W�P�W�P�W�P�W �P H�@(�W$�G(1��ff.�H��H��1�1�H��4�ׂ�CI��H��H��H��?H��H)�Hi�@BH�$1�H)�H�|$1��H���fD�ff.�@�2Q=\z����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx� �D�^`e
AH@
T D [$lA�E�G LCA�A�V�DR���A�X�LC 4BHJG B`t�0)2�
D� Q^�n��0���0L��C����B@J�*�explode_timedayoffset.7452localtime_rgmtime_rapr_time_ansi_putapr_time_nowgettimeofdayapr_time_exp_tzapr_time_exp_gmtapr_time_exp_ltapr_time_exp_getapr_time_exp_gmt_getapr_os_imp_time_getapr_os_exp_time_getapr_os_imp_time_putapr_os_exp_time_putapr_sleepselectapr_unix_setup_timeapr_time_clock_hiresL
�������������������������������������������� D�X�p�����0��0�$�8�L@d�x�.symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @�@�	�
&�,�10 900.B^W`�R@X
h
��
	�?�atimestr.o/      1747905038  1000  135   100644  3080      `
ELF>�@@
SH��H��0H���HcT$�t$�gfff���QH������P�S�@�C �C�, f�C������)B0�C��HcT$�)�H������0@�s�S�P�S	�@��Mb�C �C
�D$�C ��l�C:��A��A���A����D)B0i���CA)�D��A�����D)ʃ�0�S
�����D)�k�d)�������)���0�S��D)��)ƃ�0@�s�t$������)B0�C���)ƃ�0@�s�t$������)B0�C���)ƃ�0@�s�t$�C:���C GMT����C����)B0�C���)�1���0@�sH��0[�ff.�@SH��H��0H���HcT$�L$�gfff���QH������P�SHcT$�@�C �CH�����S�P�S�@�C �C�����C
 ���C
:�C:���C )B0�C���)���0�K	�L$�������)B0�C���)���0�K�L$�������)B0�C���)���0�K�L$�������)B0�C����Mb�)���0�K�D$�C��l��A��A���A��D)B0i���CA)�D��A������D)ʃ�0�S��ȉ��D)�k�d)��������)���0�S��D)��)�1���0�KH��0[�SH��H��H��f�H��@I�HA�@$D$$H�$I�H�D$ Ic@(H�L$I�H�D$4H�L$I�HH�D$(H�L$H���H�H��@1�[�SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx� �A�G@�A @�A�G@�AdfA�QPPC�"1 0B��L\`f`apr_rfc822_dateapr_time_exp_gmtapr_day_snamesapr_month_snamesapr_ctimeapr_time_exp_ltapr_strftime	��������'
/
t|�
���������
�
��������� D�h`.symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @�@
&,1 P 90p.B�W��R@H
 �	�i`agroupinfo.o/    1747905038  1000  135   100644  1784      `
ELF>�@@AT� I��UH����SH��0 L�D$H�T$0H�t$���uH�D$H��t$H�0L���H�EH��0 ��[]A\��H��0 ���[]A\�ff.�f�S� H��H��H��0 L�D$H�T$0H�t$���uH�T$H��t�R�H��0 [�D���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�<sB�I�F �G�@z
 CABHG HAB$\OA�R�@n
AFs)�O5apr_gid_name_getgetgrgid_rapr_pstrdupapr_gid_getgetgrnam_r(��������C	����������������� `�.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @�@ H	&,10.:=O@�J@h0	� 
	�@�Yuserinfo.o/     1747905038  1000  135   100644  2344      `
ELF>(@@AT�I��UH��H��SH��@L�D$H�T$@H�t$���uH�|$t%H�t$0L���H�EH��@��[]A\�fD���f�UH��SH��H����E��H��1�[]�ff.��U�H��H��SH��H��HL�D$H�T$@H�t$���uH�|$t�T$ �U�T$$�H��H[]�f����f�AT�I��UH����SH��@L�D$H�T$@H�t$���uH�D$H��t$H�0L���H�EH��@��[]A\��H��@���[]A\�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)zRx�0gB�I�G �G�z
 CABG$P$A�D�G SCA(xWA�L�J�t
AAC<�sB�I�F �G�z
 CABHG HABg!-p$=DK�WWshapr_uid_homepath_getgetpwnam_rapr_pstrdupapr_uid_currentgetuidgetgidapr_uid_getapr_uid_name_getgetpwuid_r)��������D	��������}��������������������������(��������C	�������� Tp|��.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @s@��	&�,�10�.:�O��J@h`	��
	Hs�Yshare/aclocal/find_apr.m4000064400000017056150336140420011277 0ustar00dnl -------------------------------------------------------- -*- autoconf -*-
dnl Licensed to the Apache Software Foundation (ASF) under one or more
dnl contributor license agreements.  See the NOTICE file distributed with
dnl this work for additional information regarding copyright ownership.
dnl The ASF licenses this file to You under the Apache License, Version 2.0
dnl (the "License"); you may not use this file except in compliance with
dnl the License.  You may obtain a copy of the License at
dnl
dnl     http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.

dnl
dnl find_apr.m4 : locate the APR include files and libraries
dnl
dnl This macro file can be used by applications to find and use the APR
dnl library. It provides a standardized mechanism for using APR. It supports
dnl embedding APR into the application source, or locating an installed
dnl copy of APR.
dnl
dnl APR_FIND_APR(srcdir, builddir, implicit-install-check, acceptable-majors,
dnl              detailed-check)
dnl
dnl   where srcdir is the location of the bundled APR source directory, or
dnl   empty if source is not bundled.
dnl
dnl   where builddir is the location where the bundled APR will will be built,
dnl   or empty if the build will occur in the srcdir.
dnl
dnl   where implicit-install-check set to 1 indicates if there is no
dnl   --with-apr option specified, we will look for installed copies.
dnl
dnl   where acceptable-majors is a space separated list of acceptable major
dnl   version numbers. Often only a single major version will be acceptable.
dnl   If multiple versions are specified, and --with-apr=PREFIX or the
dnl   implicit installed search are used, then the first (leftmost) version
dnl   in the list that is found will be used.  Currently defaults to [0 1].
dnl
dnl   where detailed-check is an M4 macro which sets the apr_acceptable to
dnl   either "yes" or "no". The macro will be invoked for each installed
dnl   copy of APR found, with the apr_config variable set appropriately.
dnl   Only installed copies of APR which are considered acceptable by
dnl   this macro will be considered found. If no installed copies are
dnl   considered acceptable by this macro, apr_found will be set to either
dnl   either "no" or "reconfig".
dnl
dnl Sets the following variables on exit:
dnl
dnl   apr_found : "yes", "no", "reconfig"
dnl
dnl   apr_config : If the apr-config tool exists, this refers to it. If
dnl                apr_found is "reconfig", then the bundled directory
dnl                should be reconfigured *before* using apr_config.
dnl
dnl Note: this macro file assumes that apr-config has been installed; it
dnl       is normally considered a required part of an APR installation.
dnl
dnl If a bundled source directory is available and needs to be (re)configured,
dnl then apr_found is set to "reconfig". The caller should reconfigure the
dnl (passed-in) source directory, placing the result in the build directory,
dnl as appropriate.
dnl
dnl If apr_found is "yes" or "reconfig", then the caller should use the
dnl value of apr_config to fetch any necessary build/link information.
dnl

AC_DEFUN([APR_FIND_APR], [
  apr_found="no"

  if test "$target_os" = "os2-emx"; then
    # Scripts don't pass test -x on OS/2
    TEST_X="test -f"
  else
    TEST_X="test -x"
  fi

  ifelse([$4], [], [
         ifdef(AC_WARNING,AC_WARNING([$0: missing argument 4 (acceptable-majors): Defaulting to APR 0.x then APR 1.x]))
         acceptable_majors="0 1"],
         [acceptable_majors="$4"])

  apr_temp_acceptable_apr_config=""
  for apr_temp_major in $acceptable_majors
  do
    case $apr_temp_major in
      0)
      apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-config"
      ;;
      *)
      apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-$apr_temp_major-config"
      ;;
    esac
  done

  AC_MSG_CHECKING(for APR)
  AC_ARG_WITH(apr,
  [  --with-apr=PATH         prefix for installed APR or the full path to 
                             apr-config],
  [
    if test "$withval" = "no" || test "$withval" = "yes"; then
      AC_MSG_ERROR([--with-apr requires a directory or file to be provided])
    fi

    for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
    do
      for lookdir in "$withval/bin" "$withval"
      do
        if $TEST_X "$lookdir/$apr_temp_apr_config_file"; then
          apr_config="$lookdir/$apr_temp_apr_config_file"
          ifelse([$5], [], [], [
          apr_acceptable="yes"
          $5
          if test "$apr_acceptable" != "yes"; then
            AC_MSG_WARN([Found APR in $apr_config, but we think it is considered unacceptable])
            continue
          fi])
          apr_found="yes"
          break 2
        fi
      done
    done

    if test "$apr_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
      apr_config="$withval"
      ifelse([$5], [], [apr_found="yes"], [
          apr_acceptable="yes"
          $5
          if test "$apr_acceptable" = "yes"; then
                apr_found="yes"
          fi])
    fi

    dnl if --with-apr is used, it is a fatal error for its argument
    dnl to be invalid
    if test "$apr_found" != "yes"; then
      AC_MSG_ERROR([the --with-apr parameter is incorrect. It must specify an install prefix, a build directory, or an apr-config file.])
    fi
  ],[
    dnl If we allow installed copies, check those before using bundled copy.
    if test -n "$3" && test "$3" = "1"; then
      for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
      do
        if $apr_temp_apr_config_file --help > /dev/null 2>&1 ; then
          apr_config="$apr_temp_apr_config_file"
          ifelse([$5], [], [], [
          apr_acceptable="yes"
          $5
          if test "$apr_acceptable" != "yes"; then
            AC_MSG_WARN([skipped APR at $apr_config, version not acceptable])
            continue
          fi])
          apr_found="yes"
          break
        else
          dnl look in some standard places
          for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do
            if $TEST_X "$lookdir/bin/$apr_temp_apr_config_file"; then
              apr_config="$lookdir/bin/$apr_temp_apr_config_file"
              ifelse([$5], [], [], [
              apr_acceptable="yes"
              $5
              if test "$apr_acceptable" != "yes"; then
                AC_MSG_WARN([skipped APR at $apr_config, version not acceptable])
                continue
              fi])
              apr_found="yes"
              break 2
            fi
          done
        fi
      done
    fi
    dnl if we have not found anything yet and have bundled source, use that
    if test "$apr_found" = "no" && test -d "$1"; then
      apr_temp_abs_srcdir="`cd \"$1\" && pwd`"
      apr_found="reconfig"
      apr_bundled_major="`sed -n '/#define.*APR_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apr_version.h\"`"
      case $apr_bundled_major in
        "")
          AC_MSG_ERROR([failed to find major version of bundled APR])
        ;;
        0)
          apr_temp_apr_config_file="apr-config"
        ;;
        *)
          apr_temp_apr_config_file="apr-$apr_bundled_major-config"
        ;;
      esac
      if test -n "$2"; then
        apr_config="$2/$apr_temp_apr_config_file"
      else
        apr_config="$1/$apr_temp_apr_config_file"
      fi
    fi
  ])

  AC_MSG_RESULT($apr_found)
])