/* $OpenBSD: ec_lcl.h,v 1.13 2019/01/19 01:12:48 tb Exp $ */
/*
 * Originally written by Bodo Moeller for the OpenSSL project.
 */
/* ====================================================================
 * Copyright (c) 1998-2010 The OpenSSL Project.  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 acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED 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 OpenSSL PROJECT OR
 * ITS 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.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 *
 * Portions of the attached software ("Contribution") are developed by
 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
 *
 * The Contribution is licensed pursuant to the OpenSSL open source
 * license provided above.
 *
 * The elliptic curve binary polynomial software is originally written by
 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
 *
 */

#include <stdlib.h>

#include <openssl/obj_mac.h>
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/bn.h>

__BEGIN_HIDDEN_DECLS

#if defined(__SUNPRO_C)
# if __SUNPRO_C >= 0x520
# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE)
# endif
#endif

#define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words)))
BIGNUM *bn_expand2(BIGNUM *a, int words);

/* Use default functions for poin2oct, oct2point and compressed coordinates */
#define EC_FLAGS_DEFAULT_OCT	0x1

/* Structure details are not part of the exported interface,
 * so all this may change in future versions. */

struct ec_method_st {
	/* Various method flags */
	int flags;
	/* used by EC_METHOD_get_field_type: */
	int field_type; /* a NID */

	/* used by EC_GROUP_new, EC_GROUP_free, EC_GROUP_clear_free, EC_GROUP_copy: */
	int (*group_init)(EC_GROUP *);
	void (*group_finish)(EC_GROUP *);
	void (*group_clear_finish)(EC_GROUP *);
	int (*group_copy)(EC_GROUP *, const EC_GROUP *);

	/* used by EC_GROUP_set_curve_GFp, EC_GROUP_get_curve_GFp, */
	/* EC_GROUP_set_curve_GF2m, and EC_GROUP_get_curve_GF2m: */
	int (*group_set_curve)(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
	int (*group_get_curve)(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);

	/* used by EC_GROUP_get_degree: */
	int (*group_get_degree)(const EC_GROUP *);

	/* used by EC_GROUP_check: */
	int (*group_check_discriminant)(const EC_GROUP *, BN_CTX *);

	/* used by EC_POINT_new, EC_POINT_free, EC_POINT_clear_free, EC_POINT_copy: */
	int (*point_init)(EC_POINT *);
	void (*point_finish)(EC_POINT *);
	void (*point_clear_finish)(EC_POINT *);
	int (*point_copy)(EC_POINT *, const EC_POINT *);

	/* used by EC_POINT_set_to_infinity,
	 * EC_POINT_set_Jprojective_coordinates_GFp,
	 * EC_POINT_get_Jprojective_coordinates_GFp,
	 * EC_POINT_set_affine_coordinates_GFp,     ..._GF2m,
	 * EC_POINT_get_affine_coordinates_GFp,     ..._GF2m,
	 * EC_POINT_set_compressed_coordinates_GFp, ..._GF2m:
	 */
	int (*point_set_to_infinity)(const EC_GROUP *, EC_POINT *);
	int (*point_set_Jprojective_coordinates_GFp)(const EC_GROUP *, EC_POINT *,
		const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
	int (*point_get_Jprojective_coordinates_GFp)(const EC_GROUP *, const EC_POINT *,
		BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
	int (*point_set_affine_coordinates)(const EC_GROUP *, EC_POINT *,
		const BIGNUM *x, const BIGNUM *y, BN_CTX *);
	int (*point_get_affine_coordinates)(const EC_GROUP *, const EC_POINT *,
		BIGNUM *x, BIGNUM *y, BN_CTX *);
	int (*point_set_compressed_coordinates)(const EC_GROUP *, EC_POINT *,
		const BIGNUM *x, int y_bit, BN_CTX *);

	/* used by EC_POINT_point2oct, EC_POINT_oct2point: */
	size_t (*point2oct)(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
	        unsigned char *buf, size_t len, BN_CTX *);
	int (*oct2point)(const EC_GROUP *, EC_POINT *,
	        const unsigned char *buf, size_t len, BN_CTX *);

	/* used by EC_POINT_add, EC_POINT_dbl, ECP_POINT_invert: */
	int (*add)(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
	int (*dbl)(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *);
	int (*invert)(const EC_GROUP *, EC_POINT *, BN_CTX *);

	/* used by EC_POINT_is_at_infinity, EC_POINT_is_on_curve, EC_POINT_cmp: */
	int (*is_at_infinity)(const EC_GROUP *, const EC_POINT *);
	int (*is_on_curve)(const EC_GROUP *, const EC_POINT *, BN_CTX *);
	int (*point_cmp)(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *);

	/* used by EC_POINT_make_affine, EC_POINTs_make_affine: */
	int (*make_affine)(const EC_GROUP *, EC_POINT *, BN_CTX *);
	int (*points_make_affine)(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);

	/* used by EC_POINTs_mul, EC_POINT_mul, EC_POINT_precompute_mult, EC_POINT_have_precompute_mult */
	int (*mul_generator_ct)(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar, BN_CTX *);
	int (*mul_single_ct)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
		const EC_POINT *point, BN_CTX *);
	int (*mul_double_nonct)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
		const BIGNUM *p_scalar, const EC_POINT *point, BN_CTX *);
	int (*precompute_mult)(EC_GROUP *group, BN_CTX *);
	int (*have_precompute_mult)(const EC_GROUP *group);

	/* internal functions */

	/* 'field_mul', 'field_sqr', and 'field_div' can be used by 'add' and 'dbl' so that
	 * the same implementations of point operations can be used with different
	 * optimized implementations of expensive field operations: */
	int (*field_mul)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
	int (*field_sqr)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
	int (*field_div)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);

	int (*field_encode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. to Montgomery */
	int (*field_decode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. from Montgomery */
	int (*field_set_to_one)(const EC_GROUP *, BIGNUM *r, BN_CTX *);
	int (*blind_coordinates)(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx);
} /* EC_METHOD */;

typedef struct ec_extra_data_st {
	struct ec_extra_data_st *next;
	void *data;
	void *(*dup_func)(void *);
	void (*free_func)(void *);
	void (*clear_free_func)(void *);
} EC_EXTRA_DATA; /* used in EC_GROUP */

struct ec_group_st {
	const EC_METHOD *meth;

	EC_POINT *generator; /* optional */
	BIGNUM order, cofactor;

	int curve_name;/* optional NID for named curve */
	int asn1_flag; /* flag to control the asn1 encoding */
	point_conversion_form_t asn1_form;

	unsigned char *seed; /* optional seed for parameters (appears in ASN1) */
	size_t seed_len;

	EC_EXTRA_DATA *extra_data; /* linked list */

	/* The following members are handled by the method functions,
	 * even if they appear generic */

	BIGNUM field; /* Field specification.
	               * For curves over GF(p), this is the modulus;
	               * for curves over GF(2^m), this is the
	               * irreducible polynomial defining the field.
	               */

	int poly[6]; /* Field specification for curves over GF(2^m).
	              * The irreducible f(t) is then of the form:
	              *     t^poly[0] + t^poly[1] + ... + t^poly[k]
	              * where m = poly[0] > poly[1] > ... > poly[k] = 0.
	              * The array is terminated with poly[k+1]=-1.
	              * All elliptic curve irreducibles have at most 5
	              * non-zero terms.
	              */

	BIGNUM a, b; /* Curve coefficients.
	              * (Here the assumption is that BIGNUMs can be used
	              * or abused for all kinds of fields, not just GF(p).)
	              * For characteristic  > 3,  the curve is defined
	              * by a Weierstrass equation of the form
	              *     y^2 = x^3 + a*x + b.
	              * For characteristic  2,  the curve is defined by
	              * an equation of the form
	              *     y^2 + x*y = x^3 + a*x^2 + b.
	              */

	int a_is_minus3; /* enable optimized point arithmetics for special case */

	void *field_data1; /* method-specific (e.g., Montgomery structure) */
	void *field_data2; /* method-specific */
	int (*field_mod_func)(BIGNUM *, const BIGNUM *, const BIGNUM *,	BN_CTX *); /* method-specific */
} /* EC_GROUP */;

struct ec_key_st {
	const EC_KEY_METHOD *meth;
	ENGINE	*engine;

	int version;

	EC_GROUP *group;

	EC_POINT *pub_key;
	BIGNUM	 *priv_key;

	unsigned int enc_flag;
	point_conversion_form_t conv_form;

	int 	references;
	int	flags;

	EC_EXTRA_DATA *method_data;
	CRYPTO_EX_DATA ex_data;
} /* EC_KEY */;

/* Basically a 'mixin' for extra data, but available for EC_GROUPs/EC_KEYs only
 * (with visibility limited to 'package' level for now).
 * We use the function pointers as index for retrieval; this obviates
 * global ex_data-style index tables.
 */
int EC_EX_DATA_set_data(EC_EXTRA_DATA **, void *data,
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
void *EC_EX_DATA_get_data(const EC_EXTRA_DATA *,
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
void EC_EX_DATA_free_data(EC_EXTRA_DATA **,
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
void EC_EX_DATA_clear_free_data(EC_EXTRA_DATA **,
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
void EC_EX_DATA_free_all_data(EC_EXTRA_DATA **);
void EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA **);

struct ec_point_st {
	const EC_METHOD *meth;

	/* All members except 'meth' are handled by the method functions,
	 * even if they appear generic */

	BIGNUM X;
	BIGNUM Y;
	BIGNUM Z; /* Jacobian projective coordinates:
	           * (X, Y, Z)  represents  (X/Z^2, Y/Z^3)  if  Z != 0 */
	int Z_is_one; /* enable optimized point arithmetics for special case */
} /* EC_POINT */;

/* method functions in ec_mult.c
 * (ec_lib.c uses these as defaults if group->method->mul is 0) */
int ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
	size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
int ec_wNAF_precompute_mult(EC_GROUP *group, BN_CTX *);
int ec_wNAF_have_precompute_mult(const EC_GROUP *group);

/* method functions in ecp_smpl.c */
int ec_GFp_simple_group_init(EC_GROUP *);
void ec_GFp_simple_group_finish(EC_GROUP *);
void ec_GFp_simple_group_clear_finish(EC_GROUP *);
int ec_GFp_simple_group_copy(EC_GROUP *, const EC_GROUP *);
int ec_GFp_simple_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int ec_GFp_simple_group_get_curve(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
int ec_GFp_simple_group_get_degree(const EC_GROUP *);
int ec_GFp_simple_group_check_discriminant(const EC_GROUP *, BN_CTX *);
int ec_GFp_simple_point_init(EC_POINT *);
void ec_GFp_simple_point_finish(EC_POINT *);
void ec_GFp_simple_point_clear_finish(EC_POINT *);
int ec_GFp_simple_point_copy(EC_POINT *, const EC_POINT *);
int ec_GFp_simple_point_set_to_infinity(const EC_GROUP *, EC_POINT *);
int ec_GFp_simple_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
int ec_GFp_simple_get_Jprojective_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
int ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
int ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, int y_bit, BN_CTX *);
size_t ec_GFp_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
	unsigned char *buf, size_t len, BN_CTX *);
int ec_GFp_simple_oct2point(const EC_GROUP *, EC_POINT *,
	const unsigned char *buf, size_t len, BN_CTX *);
int ec_GFp_simple_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
int ec_GFp_simple_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *);
int ec_GFp_simple_invert(const EC_GROUP *, EC_POINT *, BN_CTX *);
int ec_GFp_simple_is_at_infinity(const EC_GROUP *, const EC_POINT *);
int ec_GFp_simple_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *);
int ec_GFp_simple_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
int ec_GFp_simple_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
int ec_GFp_simple_points_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
int ec_GFp_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int ec_GFp_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
int ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx);
int ec_GFp_simple_mul_generator_ct(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar, BN_CTX *);
int ec_GFp_simple_mul_single_ct(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar,
	const EC_POINT *point, BN_CTX *);
int ec_GFp_simple_mul_double_nonct(const EC_GROUP *, EC_POINT *r, const BIGNUM *g_scalar,
	const BIGNUM *p_scalar, const EC_POINT *point, BN_CTX *);

/* method functions in ecp_mont.c */
int ec_GFp_mont_group_init(EC_GROUP *);
int ec_GFp_mont_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
void ec_GFp_mont_group_finish(EC_GROUP *);
void ec_GFp_mont_group_clear_finish(EC_GROUP *);
int ec_GFp_mont_group_copy(EC_GROUP *, const EC_GROUP *);
int ec_GFp_mont_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int ec_GFp_mont_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
int ec_GFp_mont_field_encode(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
int ec_GFp_mont_field_decode(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
int ec_GFp_mont_field_set_to_one(const EC_GROUP *, BIGNUM *r, BN_CTX *);

int ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx);

/* method functions in ecp_nist.c */
int ec_GFp_nist_group_copy(EC_GROUP *dest, const EC_GROUP *src);
int ec_GFp_nist_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int ec_GFp_nist_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int ec_GFp_nist_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);

/* method functions in ec2_smpl.c */
int ec_GF2m_simple_group_init(EC_GROUP *);
void ec_GF2m_simple_group_finish(EC_GROUP *);
void ec_GF2m_simple_group_clear_finish(EC_GROUP *);
int ec_GF2m_simple_group_copy(EC_GROUP *, const EC_GROUP *);
int ec_GF2m_simple_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int ec_GF2m_simple_group_get_curve(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
int ec_GF2m_simple_group_get_degree(const EC_GROUP *);
int ec_GF2m_simple_group_check_discriminant(const EC_GROUP *, BN_CTX *);
int ec_GF2m_simple_point_init(EC_POINT *);
void ec_GF2m_simple_point_finish(EC_POINT *);
void ec_GF2m_simple_point_clear_finish(EC_POINT *);
int ec_GF2m_simple_point_copy(EC_POINT *, const EC_POINT *);
int ec_GF2m_simple_point_set_to_infinity(const EC_GROUP *, EC_POINT *);
int ec_GF2m_simple_point_set_affine_coordinates(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int ec_GF2m_simple_point_get_affine_coordinates(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
int ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, int y_bit, BN_CTX *);
size_t ec_GF2m_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
	unsigned char *buf, size_t len, BN_CTX *);
int ec_GF2m_simple_oct2point(const EC_GROUP *, EC_POINT *,
	const unsigned char *buf, size_t len, BN_CTX *);
int ec_GF2m_simple_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
int ec_GF2m_simple_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *);
int ec_GF2m_simple_invert(const EC_GROUP *, EC_POINT *, BN_CTX *);
int ec_GF2m_simple_is_at_infinity(const EC_GROUP *, const EC_POINT *);
int ec_GF2m_simple_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *);
int ec_GF2m_simple_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
int ec_GF2m_simple_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
int ec_GF2m_simple_points_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
int ec_GF2m_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int ec_GF2m_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
int ec_GF2m_simple_field_div(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);

/* method functions in ec2_mult.c */
int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
	size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
int ec_GF2m_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
int ec_GF2m_have_precompute_mult(const EC_GROUP *group);

/* method functions in ec2_mult.c */
int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
	size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
int ec_GF2m_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
int ec_GF2m_have_precompute_mult(const EC_GROUP *group);

#ifndef OPENSSL_EC_NISTP_64_GCC_128
/* method functions in ecp_nistp224.c */
int ec_GFp_nistp224_group_init(EC_GROUP *group);
int ec_GFp_nistp224_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *n, BN_CTX *);
int ec_GFp_nistp224_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
int ec_GFp_nistp224_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
int ec_GFp_nistp224_points_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx);
int ec_GFp_nistp224_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
int ec_GFp_nistp224_have_precompute_mult(const EC_GROUP *group);

/* method functions in ecp_nistp256.c */
int ec_GFp_nistp256_group_init(EC_GROUP *group);
int ec_GFp_nistp256_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *n, BN_CTX *);
int ec_GFp_nistp256_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
int ec_GFp_nistp256_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
int ec_GFp_nistp256_points_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx);
int ec_GFp_nistp256_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
int ec_GFp_nistp256_have_precompute_mult(const EC_GROUP *group);

#ifdef ECP_NISTZ256_ASM
const EC_METHOD *EC_GFp_nistz256_method(void);
#endif

/* EC_METHOD definitions */

struct ec_key_method_st {
	const char *name;
	int32_t flags;
	int (*init)(EC_KEY *key);
	void (*finish)(EC_KEY *key);
	int (*copy)(EC_KEY *dest, const EC_KEY *src);
	int (*set_group)(EC_KEY *key, const EC_GROUP *grp);
	int (*set_private)(EC_KEY *key, const BIGNUM *priv_key);
	int (*set_public)(EC_KEY *key, const EC_POINT *pub_key);
	int (*keygen)(EC_KEY *key);
	int (*compute_key)(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
	    void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen));
	int (*sign)(int type, const unsigned char *dgst, int dlen, unsigned char
	    *sig, unsigned int *siglen, const BIGNUM *kinv,
	    const BIGNUM *r, EC_KEY *eckey);
	int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
	    BIGNUM **rp);
	ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, int dgst_len,
	    const BIGNUM *in_kinv, const BIGNUM *in_r,
	    EC_KEY *eckey);
	int (*verify)(int type, const unsigned char *dgst, int dgst_len,
	    const unsigned char *sigbuf, int sig_len, EC_KEY *eckey);
	int (*verify_sig)(const unsigned char *dgst, int dgst_len,
	    const ECDSA_SIG *sig, EC_KEY *eckey);
} /* EC_KEY_METHOD */;

#define EC_KEY_METHOD_DYNAMIC   1

int ossl_ec_key_gen(EC_KEY *eckey);
int ossl_ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
    void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen));
int ossl_ecdsa_verify(int type, const unsigned char *dgst, int dgst_len,
    const unsigned char *sigbuf, int sig_len, EC_KEY *eckey);
int ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len,
    const ECDSA_SIG *sig, EC_KEY *eckey);

/* method functions in ecp_nistp521.c */
int ec_GFp_nistp521_group_init(EC_GROUP *group);
int ec_GFp_nistp521_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *n, BN_CTX *);
int ec_GFp_nistp521_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
int ec_GFp_nistp521_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
int ec_GFp_nistp521_points_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx);
int ec_GFp_nistp521_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
int ec_GFp_nistp521_have_precompute_mult(const EC_GROUP *group);

/* utility functions in ecp_nistputil.c */
void ec_GFp_nistp_points_make_affine_internal(size_t num, void *point_array,
	size_t felem_size, void *tmp_felems,
	void (*felem_one)(void *out),
	int (*felem_is_zero)(const void *in),
	void (*felem_assign)(void *out, const void *in),
	void (*felem_square)(void *out, const void *in),
	void (*felem_mul)(void *out, const void *in1, const void *in2),
	void (*felem_inv)(void *out, const void *in),
	void (*felem_contract)(void *out, const void *in));
void ec_GFp_nistp_recode_scalar_bits(unsigned char *sign, unsigned char *digit, unsigned char in);

#endif

__END_HIDDEN_DECLS


/*
 * Soft:        Vrrpd is an implementation of VRRPv2 as specified in rfc2338.
 *              VRRP is a protocol which elect a master server on a LAN. If the
 *              master fails, a backup server takes over.
 *              The original implementation has been made by jerome etienne.
 *
 * Part:        vrrp_notify.c include file.
 *
 * Author:      Alexandre Cassen, <acassen@linux-vs.org>
 *
 *              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.
 *
 *              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
 *              2 of the License, or (at your option) any later version.
 *
 * Copyright (C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>
 */

#ifndef _VRRP_NOTIFY_H
#define _VRRP_NOTIFY_H

/* local include */
#include "vrrp.h"

extern void send_event_notify(vrrp_t *, int);
extern void send_instance_notifies(vrrp_t *);
extern void send_group_notifies(vrrp_sgroup_t *);
extern void send_instance_priority_notifies(vrrp_t *);
extern void notify_shutdown(void);

#endif


/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import com.adobe.test.Assert;

/*
* Date: 26 November 2000
*
*
*SUMMARY: Passing a RegExp object to a RegExp() constructor.
*This test arose from Bugzilla bug 61266. The ECMA3 section is:
*
*  15.10.4.1 new RegExp(pattern, flags)
*
*  If pattern is an object R whose [[Class]] property is "RegExp" and
*  flags is undefined, then let P be the pattern used to construct R
*  and let F be the flags used to construct R. If pattern is an object R
*  whose [[Class]] property is "RegExp" and flags is not undefined,
*  then throw a TypeError exception. Otherwise, let P be the empty string
*  if pattern is undefined and ToString(pattern) otherwise, and let F be
*  the empty string if flags is undefined and ToString(flags) otherwise.
*
*
*The current test will check the first scenario outlined above:
*
*   "pattern" is itself a RegExp object R
*   "flags"  is undefined
*
* We check that a new RegExp object obj2 defined from these parameters
* is morally the same as the original RegExp object obj1. Of course, they
* can't be equal as objects - so we check their enumerable properties...
*
* In this test, the initial RegExp obj1 will include a flag. The flags
* parameter for obj2  will be undefined in the sense of not being provided.
*/
//-------------------------------------------------------------------------------------------------

// var SECTION = "e15_10_4_1_3";
// var VERSION = "";
// var TITLE   = "Passing a RegExp object to a RegExp() constructor";
// var bug = "61266";

var testcases = getTestCases();

function getTestCases() {
    var array = new Array();
    var item = 0;

    var statprefix = 'Applying RegExp() twice to pattern ';
    var statmiddle = ' and flag ';
    var statsuffix =  '; testing property ';
    var singlequote = "'";
    var i = -1; var j = -1; var s = '';
    var obj1 = null; var obj2 = null;
    var status = ''; var actual = ''; var expect = ''; var msg = '';
    var patterns = new Array();
    var flags = new Array();

    // various regular expressions to try -
    patterns[0] = '';
    patterns[1] = 'abc';
    patterns[2] = '(.*)(3-1)\s\w';
    patterns[3] = '(.*)(...)\\s\\w';
    patterns[4] = '[^A-Za-z0-9_]';
    patterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)';

    // various flags to try -
    flags[0] = 'i';
    flags[1] = 'g';
    flags[2] = 'm';
    flags[3] = undefined;

    for (i in patterns)
    {
      s = patterns[i];

      for (j in flags)
      {
        f = flags[j];
        status = getStatus(s, f);
        obj1 = new RegExp(s, f);
        obj2 = new RegExp(obj1);

        msg  = status + quote("dotall");
        actual = obj2.dotall;
        expect = obj1.dotall;
        array[item++] = Assert.expectEq( msg, expect, actual);

        msg  = status + quote("extended");
        actual = obj2.extended;
        expect = obj1.extended;
        array[item++] = Assert.expectEq( msg, expect, actual);

        msg  = status + quote("ignoreCase");
        actual = obj2.ignoreCase;
        expect = obj1.ignoreCase;
        array[item++] = Assert.expectEq( msg, expect, actual);

        msg  = status + quote("lastIndex");
        actual = obj2.lastIndex;
        expect = obj1.lastIndex;
        array[item++] = Assert.expectEq( msg, expect, actual);

        msg  = status + quote("multiline");
        actual = obj2.multiline;
        expect = obj1.multiline;
        array[item++] = Assert.expectEq( msg, expect, actual);

        msg  = status + quote("source");
        actual = obj2.source;
        expect = obj1.source;
        array[item++] = Assert.expectEq( msg, expect, actual);
      }
    }

    function getStatus(regexp, flag)
    {
      return (statprefix  +  quote(regexp) +  statmiddle  +  flag  +  statsuffix);
    }

    function quote(text)
    {
      return (singlequote  +  text  + singlequote);
    }

    return array;
}


<PAPER>
	<ABSTRACT>
		<S sid ="1" ssid = "1">When translating from languages with hardly any inl1ectional morphology like English into morphologically rich lan guages, the English word forms often do not contain enough information for producing the correct fullform in the target language.</S>
		<S sid ="2" ssid = "2">We investigate meth ods for improving the quality of such translations by making usc of part-of speech information and maximum en tropy modeling.</S>
		<S sid ="3" ssid = "3">Results Cor translations from English into Spanish and Catalan are presented on the LC-STAR corpus which consists of spontaneously spoken dialogues in the domain of appointment scheduling and travel planning.</S>
	</ABSTRACT>

			<S sid ="4" ssid = "4">In this paper, we address the question of how part of-speech ( POS) information can help improv ing the quality of Statistical Machine Translation (SMT).</S>
			<S sid ="5" ssid = "5">One of the main problems when translat ing from a language with hm·dly any inflectional morphology (which is English in our experiments) into one with richer morphology (here: Spanish and Catalan) is the production of the correct in flected form in the target lan guage.</S>
			<S sid ="6" ssid = "6">We introduce transformations to the English string that are based on the part-of-speech information and show how this knowledge source can help SMT.</S>
			<S sid ="7" ssid = "7">Systematic evaluations will show that the quality of the gen erated translations is improved.</S>
			<S sid ="8" ssid = "8">The transfonnations we apply arc the following: Treatment of verbs In Catalan and Spanish, the pronoun before a verb is often omitted and in stead, the person is expressed via the ending of the verb.</S>
			<S sid ="9" ssid = "9">The smne holds for future tense and for the modes expressed through 'would ' and 'should' in English.</S>
			<S sid ="10" ssid = "10">Since this makes it hard to generate the correct translation of a given English verb, we propose a method re sulting in English word forms containing suf ficient infonnation.</S>
			<S sid ="11" ssid = "11">Question inversion In English, interrogative phrases have a word order that is different from declarative sentences: Either an auxil iary 'do·is inserted or the order of verb and pronoun is inverted.</S>
			<S sid ="12" ssid = "12">Since this is dilTerent in Spanish and Catalan, we modify the word order in English to make it more similar to the Spanish/Catalan one and to help the verb treatment mentioned above.</S>
			<S sid ="13" ssid = "13">The paper is organized as follows: Related work is treated in Section 2.</S>
			<S sid ="14" ssid = "14">In Section 3, we shortly review the statistical approach to machine transla tion.</S>
			<S sid ="15" ssid = "15">Then, we introduce the transfonnations that we apply to the less inflected language of the two under consideration (namely English) in Section 4.</S>
			<S sid ="16" ssid = "16">After describing the maximum entropy approach and the training procedure we use for the statisti cal lexicon in Section 5, we present results on the trilingual LC-STAR corpus in Section 6.</S>
			<S sid ="17" ssid = "17">Then, we conclude and present ideas about future work in Section 7.</S>

			<S sid ="18" ssid = "1">Publications dealing with the integration of lin guistic information into the process of statisti cal machine translation are rather few allhough this had already been suggested in (Brown et al., 1992).</S>
			<S sid ="19" ssid = "2">(NieBen and Ney, 200 Ib) introduce hier archical lexicon models including baseform and POS information for translation from German into English.</S>
			<S sid ="20" ssid = "3">Information contained in the German en tries that are not relevant for the generation of the English translation arc omitted.</S>
			<S sid ="21" ssid = "4">Unlike this, we investigate methods for enriching English with knowledge to help selecting the correct fullform in a morphologically richer language.</S>
			<S sid ="22" ssid = "5">(NieBen and Ney, 200 l a) propose reordering oper ations for the language pair GennanEnglish that help SMT by harmonizing word order between source and target.</S>
			<S sid ="23" ssid = "6">The question inversion we apply was inspired by this; nevertheless, we do not per form a full morpho-syntactic analysis, but make use only of POS information which can be ob tained from freely available tools.</S>
			<S sid ="24" ssid = "7">(GarciaVarea et al..</S>
			<S sid ="25" ssid = "8">2001) apply a maximum en tropy approach for training the statistical lexicon, but do not take any linguistic information into ac count.</S>
			<S sid ="26" ssid = "9">The use ofPOS information for improving statisti cal alignment quality is described in (Toutanova et al..</S>
			<S sid ="27" ssid = "10">2002), but no translation results are presented.</S>

			<S sid ="28" ssid = "1">The goal of machine translation is the translation of an input string -"1, ...</S>
			<S sid ="29" ssid = "2">, SJ in the source language into a target language string L1, . . .</S>
			<S sid ="30" ssid = "3">, l r. We choose the string that has maximal probability given the source string, Pr ( t{[ s{).</S>
			<S sid ="31" ssid = "4">Applying Bayes' deci sion rule yields the following criterion: arg max Pr ( t{ [s{ ) tf = arg m x{Pr( l{) · Pr( s{l l{)} (1) tl Through this decomposition of the probability, we obtain two knowledge sources: the translation and the language model.</S>
			<S sid ="32" ssid = "5">Those two can be modelled independently of each other.</S>
			<S sid ="33" ssid = "6">The cotTespondence between the words in the source and the target string is described by align ments that assign target word positions to each source word position.</S>
			<S sid ="34" ssid = "7">The probability of a certain target language word to occur in the target string is assumed to depend basically only on the source words aligned to it.</S>
			<S sid ="35" ssid = "8">The search is denoted by the arg rna.x operation in Eq. 1, i.e. it explores the space of all possible target language strings and all possible alignments between the source and the target language string to find the one with maximal probability.</S>
			<S sid ="36" ssid = "9">The input string can be preprocessed before being passed to the search algorithm.</S>
			<S sid ="37" ssid = "10">If necessary, the inverse of these transformations will be applied to the generated output string.</S>
			<S sid ="38" ssid = "11">In the work pre sented here, we restrict ourselves to transfotming only one language of the two: the source, which has the less inflected morphology.</S>
			<S sid ="39" ssid = "12">For descriptions of SMT systems see for exam ple (Germann et al., 2001; Och et al., 1999; Till mann and Ney, 2002; Vogel et al..</S>
			<S sid ="40" ssid = "13">2000; Wang and Waibel, 1997).</S>

			<S sid ="41" ssid = "1">Inflected Language When translating from English into languages with a highly inflected morphology, the production of the cotTect fullfonn often causes problems.</S>
			<S sid ="42" ssid = "2">Our experience on several corpora shows that the error rate or a translation from English into morpholog ically richer languages decreases by 10% relative if we aim at producing only the correct baseform instead of the fully inflected word.</S>
			<S sid ="43" ssid = "3">The transfer of the meaning expressed in the baseform is easier than deciding on the correct inOecLed form.</S>
			<S sid ="44" ssid = "4">4.1 Treatment of.</S>
			<S sid ="45" ssid = "5">Verbs Especially the translation of verbs is difficult since there are many different inflections in Spanish and Catalan whereas there are only few in En glish.</S>
			<S sid ="46" ssid = "6">Moreover, the pronouns and modals are of ten omiued in Spanish and CaLalan and this infor mation is expressed through the suffix.</S>
			<S sid ="47" ssid = "7">This makes it very hard for word-based systems to generate the correct inflection from the English verb which docs not contain sufficient information.</S>
			<S sid ="48" ssid = "8">Thus, sev eral English words will have to be aligned to the Spanish or Catalan verbs.</S>
			<S sid ="49" ssid = "9">This process is rela tively difficult for the algorithm and causes noise in the statistical lexicon i C English pronouns are re garded as translations of Spanish or Catalan verbs.</S>
			<S sid ="50" ssid = "10">In order to enrich the English verb with the needed information, we combine pronouns and/or modals with following verbs and treat those combinations as 'new' Cullform words in English.</S>
			<S sid ="51" ssid = "11">Thus we can obtain the information needed to select the con·ect verb form in the target language from one single English word.</S>
			<S sid ="52" ssid = "12">The identif1cation or English pro nouns, modals and verbs was done by POS tag ging applied to the English part of the corpus.</S>
			<S sid ="53" ssid = "13">We decided to transform the source language in stead of the target language, because in this case we need only the POS tags of the source language as additional knowledge source and nothing else.</S>
			<S sid ="54" ssid = "14">Another possible approach would have been to split the suffix in the target language (e.g. 'esta' into 'estar P3S').</S>
			<S sid ="55" ssid = "15">This would require postprocess ing tools that are able to generate the correct verb ronn !'rom the haserorm and the person and tense information.</S>
			<S sid ="56" ssid = "16">Table 1 gives examples of words that have been spliced to fonn new entries ol' the English lexi con.</S>
			<S sid ="57" ssid = "17">For example, we splice the phrase 'you think' to form the single entry 'you_think' which con tains sufficient information for producing the cor rect Spanish verb form 'crees' or the Catalan 'creus'.</S>
			<S sid ="58" ssid = "18">Similarly, the modal auxiliaries can be added as well, like in the entry 'you_wilLhave' which is much better suited for being translated into 'tendnis' (Spanish) or 'tindras' (Catalan) than the verb 'have' alone.</S>
			<S sid ="59" ssid = "19">Moreover, in a single word based lexicon, three single entries would have to be added Cor the translation of 'you will have' into 'tendras': (you,tendras), (will,tendras) and (have,tendnis), which spreads the translation prob ability over far too many entries and makes the probability distribution unfocused.</S>
			<S sid ="60" ssid = "20">As the last example in Table l shows, 'you can go' is spliced only into two words instead of one in order to better match the Spanish/Catalan form.</S>
			<S sid ="61" ssid = "21">4.2 Question Treatment.</S>
			<S sid ="62" ssid = "22">In English interrogative phrases, either an auxil iary 'do' is inserted or the order of verb and pro noun is inverted.</S>
			<S sid ="63" ssid = "23">The au x iliary 'do' does not carry information that is relevant when translating into Table 1: Examples of spliced words in the English vocabulary I original I POS tags I spliced words I yo u go P R P V B P yo u_ go yo u we nt PR P V B D yo u we nt yo u thi nk PR P V BP yo u_ thi nk yo u wi ll ha ve P R P M D V B yo u wi ll ha ve yo u ca n go P R P M D V B yo u ca n go Spanish or Catalan.</S>
			<S sid ="64" ssid = "24">Thus, we can remove it from the sentence without hanning the translation pro cess (as described in (NicBen and Ney, 200la) for the language pair GermanEnglish).</S>
			<S sid ="65" ssid = "25">However, we do not remove a question supporting 'do' in past tense, i. e. 'did' is kept in the phrase, because this is the only word containing the tense information.</S>
			<S sid ="66" ssid = "26">Afterwards, we can merge the pronoun and verb as depicted in Table 2: 'did you go' is transformed into 'you_did go'.</S>
			<S sid ="67" ssid = "27">We do not splice 'you_did' and 'go', because the English simple past is translated into present perfect in Catalan; and it is very likel y to he translated into present perl'ect in Spanish, es pecially in colloquial language as it is present in this task.</S>
			<S sid ="68" ssid = "28">The form 'you_did go' is well suited to be translated into the Spanish 'has ido' or the Cata lan 'has anat'.</S>
			<S sid ="69" ssid = "29">IC there is no question supporting 'do' and the or der of pronoun and verb is inverted see the exam ple 'how are you?' in Table 3 - we first swap the two words and then perform the splicing step.</S>
			<S sid ="70" ssid = "30">This is done in order to avoid having two lexical entries with the same translation: for example, 'you_are ' and the interrogative 'are_you ' hoth have the same translation in Spanish or Catalan, respectively.</S>
			<S sid ="71" ssid = "31">Table 3 presents examples of transformed EngIish queslions.</S>
			<S sid ="72" ssid = "32">Comparing them to the Spanish and Catalan reference, we see that it is easier to find a word-to word mapping for the modified English sentences.</S>

			<S sid ="73" ssid = "1">Training If we merge the pronouns/modals and verbs as de scribed above, it might happen thalthe verh itsell' (or one of its inflections) has never been seen in training except fi·om its appearance in the new en tries in the lexicon which result from the splic Table 2: Examples of spliced words in the English vocabulary after question inversion ori gi na l PO S ta gs spl ice d w or ds do yo u go V BP PR P V B yo u_ go di d yo u go V B D P R P V B yo u_ di d go ha ve yo u go ne V B P P R P V B N yo u_ ha ve go ne wi ll yo u go M D P R P V B yo u_ wi lL go ca n yo u go P R P M D V B yo u_ ca n go Table 3: Examples of transformed English sentences Or igi na l ho w are yo u?</S>
			<S sid ="74" ssid = "2">Q ue sti on In ve rsi on ho w yo u ar c'!</S>
			<S sid ="75" ssid = "3">Ve rb Tr eat m en t ho w yo u_ are ? Ca tal an Se nt en ce co m es ta ? Sp ani sh Se nt en ce i., co m o est as ? Or igi na l or do yo u thi nk we wa nt to sta y [..</S>
			<S sid ="76" ssid = "4">] ? Q ue sti on In ve rsi on or yo u thi nk we wa nt to st a y[ ...</S>
			<S sid ="77" ssid = "5">] ? Ve rb Tr ea tm en t or yo u_ thi nk we _w ant to sta y [..</S>
			<S sid ="78" ssid = "6">] ? Ca tal an Se nt en ce o cre u qu e vo ldr em qu edar no s [..</S>
			<S sid ="79" ssid = "7">Sp ani sh Se nt en ce (, o cre e qu e qu err e m os qu ed ar no s [.</S>
			<S sid ="80" ssid = "8">] ? Or igi na l di d yo u sa y the ei gh tee nt h ? Qu est ion In ve rsi on yo u di d sa y the eig hte ent h ? Ve rb Tr eat m en t yo u_ di d sa y the ei gh te en th ? Ca tal an Se nt en ce has dit el div uit ? Sp ani sh Se nt en ce (, ha s dic ho el di ec io ch o ? ing operation.</S>
			<S sid ="81" ssid = "9">This makes it impossible to trans late the verb itself, because it is then unknown to the system.</S>
			<S sid ="82" ssid = "10">The same holds for combinations of pronouns and verbs that are unseen in train ing, e. g. the training corpus contains the bigram '1 went', but not the one 'she went'.</S>
			<S sid ="83" ssid = "11">In order to overcome this problem, we train our lexicon model using maximum entropy.</S>
			<S sid ="84" ssid = "12">5.1 The Maximum Entropy Approach.</S>
			<S sid ="85" ssid = "13">The maximum entropy approach (Berger et al., 1996) presents a powerful framework for the com bination or several knowledge sources.</S>
			<S sid ="86" ssid = "14">This prin ciple recommends to choose the distribution which preserves as much uncertainty as possible in terms or maximizing the entropy.</S>
			<S sid ="87" ssid = "15">The distribution is re quired to satisfy constraints, which represent facts known from the data.</S>
			<S sid ="88" ssid = "16">These constraints are ex pressed on the basis of feature functions hm ( s , t), where ( s, t) is a pair of source and target word.</S>
			<S sid ="89" ssid = "17">The lexicon probability of a source word given the target word has the following functional form p(si L ) = .%'t ) exp [LAmhm(s , L) l U l with the normalization factor where /\ = {Am} is the set of model parameters with one weight Am Cor each feature function hm.</S>
			<S sid ="90" ssid = "18">The features we usc in our model arc • a lexical feature (Cor the entries of Lhe trans formed vocabulary): hs',t'(s , t ) = 8(s , s' ) ·8(t, t') • the verb contained in a transformed lexicon entry (e.g. 'go' Cor 'you_go' or 'you_wi!Lgo): where 1, ift contains the verb v Verb(t, v) = { 0, otherwise This enables us to translate the verb alone even if it occurs in the training corpus only as a spliced entry.</S>
			<S sid ="91" ssid = "19">For an introduction to maximum entropy modeling and training procedures, the reader is refened to the corresponding literature, for instance (Berger et al., 1996) or (Ratnapark:hi, 1997).</S>
			<S sid ="92" ssid = "20">5.2 Training.</S>
			<S sid ="93" ssid = "21">We performed the following training steps: • transform the English (= source language) part or the corpus as described in Seclions 4.1 and 4.2 • train the statistical translation system using this modi fled source language corpus 1 • with the resuiLing alignment, train the lexicon model using maximum entropy with the fea tures described in Section 5.1 This training can be pelformed using converg ing iterative training procedures like described by (Darroch and Ratcliff.</S>
			<S sid ="94" ssid = "22">1972) or (Della Pietra et al., 1997) 2 . The basic training procedures for the translation system and the language model need not be changed.</S>
			<S sid ="95" ssid = "23">5.3 Translation process.</S>
			<S sid ="96" ssid = "24">For translation, we can use an SMT system where the search algorithm does not have to be modified.</S>
			<S sid ="97" ssid = "25">Before the translation process, we transform the input in the same way as the training corpus be fore training the alignment (see Section 5.2).</S>
			<S sid ="98" ssid = "26">We simply have to exclude those words from splicing where the splicing operation yields an unknown word.</S>
			<S sid ="99" ssid = "27">1Tbis training was done using the GIZA++ toolkit which c;m be downloaded from http://wwwi6.infmmatik.rwth aachcn.dcroch/softwarc/GTZA++.html 6 Result s 6.1 Corpora We performed experiments on the trilingual corpus which is successively built within the LC-STAR project.</S>
			<S sid ="100" ssid = "28">It comprises the languages English, Spanish and Catalan, whereof we used English as source and Spanish and Catalan as tar get languages.</S>
			<S sid ="101" ssid = "29">At the time of our experiments, we had about 13k sentences per language available; the statistics are given in Table 4.</S>
			<S sid ="102" ssid = "30">The corpus consists of transcriptions of sponta neously spoken dialogues.</S>
			<S sid ="103" ssid = "31">Thus, the sentences often lack correct syntactic structure.</S>
			<S sid ="104" ssid = "32">The domain of this task is appointment scheduling and travel arrangements.</S>
			<S sid ="105" ssid = "33">The POS information for the English part of the corpus was generated using the Brill tagger3.</S>
			<S sid ="106" ssid = "34">As Table 4 shows, the splicing operation increases the cardinality of the English vocabulary as well as the number of singletons significantly.</S>
			<S sid ="107" ssid = "35">Nevertheless, they are still below those numbers for Spanish and Catalan.</S>
			<SUBSECTION>6.2 Evaluation.</SUBSECTION>
			<S sid ="108" ssid = "36">Metrics The quality of the output of our machine transla tion system is measured automatically by compar ing the generated translation to a given reference translation.</S>
			<S sid ="109" ssid = "37">The two following criteria are used: • WER (word error rate): The word error rate is based on Lhe Leven shtein distance.</S>
			<S sid ="110" ssid = "38">It is computed as the min imum number of substitution, insertion and deletion operations that have to be performed to convert the generated string into the ref erence string.</S>
			<S sid ="111" ssid = "39">Since some sentences in the develop and test set occur several times with different reference translations (which holds especially !'or short sentences like 'okay, goodbye'), we calculate the minimal dis tance to this set of references as proposed in (NieBen et al., 2000).</S>
			<S sid ="112" ssid = "40">• BLEU (bilingual evaluation understudy): (Papineni et al., 2002) have proposed a 2We made use of the toolkit YASMET which can be downloaded from http://v,·wwi6.informatik.rwth aachen.derochlsoftware/YASME'l.html 3The Brill tagger can be downloaded ti"om http://www.research.microsoft.com/users/brill/ Table 4: Statistics of the training, develop and test set of the EnglishSpanish-Catalan LC-STAR corpus (*number of words without punctuation marks) E n g l i s h I I Spa nish Catalan I II O ri gi na l I Transformed I Tr ai ni ng Sentences W o r d s W o r d s * 1 3 3 5 2 123 454 I 114099 II 118 534 II 118 137 1017 38 I 92383 II 96997 II 96503 V oc ab ul ar y Size S i n g l e t o n s 215 4 j 2776 jj 3933 jj 3572 79o C37%) 1 l 165 (42%) II 1 844 (47%) II I 658 (47%) De ve lo p Sentences W o r d s U n k n o w n W o r d s 2 7 2 226 7 j 2096 jj 2217 jj 2211 21 I 22 II 34 II 34 Te st Sentences W o r d s U n k n o w n W o r d s 2 6 2 262 17 I 18 II 30 II 35 method of automatic machine translation evaluation, which they call "BLEU".</S>
			<S sid ="113" ssid = "41">It is based on the notion of modified n-gram pre cision, for which all candidate n-gram counts in the translation are collected and clipped against their corresponding maximum refer ence counts.</S>
			<S sid ="114" ssid = "42">These clipped candidate counts are summed and normalized by the total num ber of candidate n-grams.</S>
			<S sid ="115" ssid = "43">Since BLEU ex presses quality, we determine 100BLEU to transform it into an error measure.</S>
			<S sid ="116" ssid = "44">Although these measures are only approximations, they seem to be surflcient at the present level or petformance of machine translation systems.</S>
			<SUBSECTION>6.3 Experimental Results.</SUBSECTION>
			<S sid ="117" ssid = "45">We compared the two statistical lexica obtained from the baseline system and from the maximum entropy training on the transformed corpus.</S>
			<S sid ="118" ssid = "46">For the baseline lexicon, we observed an average of 5.82 Catalan translation candidates per English.</S>
			<S sid ="119" ssid = "47">word and 6.16 Spanish translation candidates.</S>
			<S sid ="120" ssid = "48">These numbers are significantly reduced in the lexicon which was trained on the transformed corpus using maximum entropy: there, we have an average of 4.20 for Catalan and 4.46 for Spanish.</S>
			<S sid ="121" ssid = "49">Especially for (nominative) English pronouns (which have many verbs as translation candidates in the baseline lexicon), the number of translation candidates was substantially scaled down by a factor around 4.</S>
			<S sid ="122" ssid = "50">This shows that our method was successful in producing a more focused lexicon probability distribution.</S>
			<S sid ="123" ssid = "51">We performed translation experiments with an implementation of the IBM4 translation model (Brown et al., 1993).</S>
			<S sid ="124" ssid = "52">A description of the system can be found in (Tillmann and Ney, 20 02 ).</S>
			<S sid ="125" ssid = "53">Table 5 presents an assessment or translation qual ity for both the language pairs English--Catalan and EnglishSpanish.</S>
			<S sid ="126" ssid = "54">We see that there is a signif icant decrease in error rate for the translation into Catalan.</S>
			<S sid ="127" ssid = "55">This change is consistent across bother ror rates, the WER and 100BLEU.</S>
			<S sid ="128" ssid = "56">For translations from English into Spanish, the improvement is less substantial.</S>
			<S sid ="129" ssid = "57">A reason for this might be that the Spanish vocabulary contains more entries and the ratio between l'uHrorms and baseforms is higher: 1.57 for Spanish versus 1.53 for Catalan4 • This makes it more difficult for the system to choose the correct inflection when gen erating a Spanish sentence.</S>
			<S sid ="130" ssid = "58">We assume that the extension or our approach to other word classes than verbs will yield a quality gain for translations into Spanish.</S>
			<S sid ="131" ssid = "59">Table 6 shows several sentences from the English LC-STAR develop and test corpus that were trans 4 The lemmatization of Spanish and CaLalan was produced using the analyser from UPC Barcelona: MACO+ andRE LAX.</S>
			<S sid ="132" ssid = "60">Table 5: Translation error rates[%] for EnglishCatalan and for EnglishSpanish I Develop I Test I WER I 100BLEU WER I I 00BLEU Ca tal an Baseline 3 7 . 6 5 8 . 2 3 3 . 0 4 9 . 2 + T r a n s f o r m a t i o n s 3 5 . 0 5 5 . 1 3 0 . 8 4 6 . 6 Sp an is h Baseline 3 5 . 4 5 7 . 6 3 2 . 1 4 8 . 9 + T r a n s f o r m a t i o n s 3 5 . 0 5 5 . 8 3 1 . 5 4 7 . 6 lated into Catalan.</S>
			<S sid ="133" ssid = "61">We see that it is easier for the system to generate the correct verb inflection in Catalan if the verb is enriched with the pronoun.</S>
			<S sid ="134" ssid = "62">In the baseline system, it happens that words are inserted- like 'far' as translation of 'will' in the second example which is incorrect.</S>
			<S sid ="135" ssid = "63">This can be avoided by the splicing of words.</S>
			<S sid ="136" ssid = "64">In the last example, we see that the baseline system generates one word each for the English 'I prefer' and does not find the correct translation, whereas transformations yield an accurate transla tion of this expression, because the spliced word contains sul'ficienl inl'ormalion.</S>
			<S sid ="137" ssid = "65">7 Conclusion and Future Work.</S>
			<S sid ="138" ssid = "66">We presented a method for improving quality of statistical machine translation from English into morphologically richer languages like Spanish and Catalan.</S>
			<S sid ="139" ssid = "67">Using POS tags as additional knowledge source, we enrich the English verbs such that they contain more information relevant for selecting the conect inflected form in the target language.</S>
			<S sid ="140" ssid = "68">The lexicon model was then trained using the maxi mum entropy approach, taking the verbs as addi tional features.</S>
			<S sid ="141" ssid = "69">Results were given for translation from English into Spanish and Catalan on the LC-STAR cor pus which consists of spontaneously spoken dia logues in the domain of appointment scheduling and travel arrangement.</S>
			<S sid ="142" ssid = "70">Our experiments show that translation quality can be signif1cantly in creased through the use of our approach: the word error rate on the Catalan development set for ex ample decreased by 2.5% absolute.</S>
			<S sid ="143" ssid = "71">We plan to investigate other methods of enrich ing the English words with information.</S>
			<S sid ="144" ssid = "72">It will be interesting to see how other word classes, e. g. nouns, can be handled in order to improve quality of translations into languages with a highly inflected morphology.</S>
			<S sid ="145" ssid = "73">8</S>

</PAPER>


//
// Base styles
//

.card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
  height: $card-height;
  word-wrap: break-word;
  background-color: $card-bg;
  background-clip: border-box;
  border: $card-border-width solid $card-border-color;
  @include border-radius($card-border-radius);

  > hr {
    margin-right: 0;
    margin-left: 0;
  }

  > .list-group:first-child {
    .list-group-item:first-child {
      @include border-top-radius($card-border-radius);
    }
  }

  > .list-group:last-child {
    .list-group-item:last-child {
      @include border-bottom-radius($card-border-radius);
    }
  }
}

.card-body {
  // Enable `flex-grow: 1` for decks and groups so that card blocks take up
  // as much space as possible, ensuring footers are aligned to the bottom.
  flex: 1 1 auto;
  // Workaround for the image size bug in IE
  // See: https://github.com/twbs/bootstrap/pull/28855
  min-height: 1px;
  padding: $card-spacer-x;
  color: $card-color;
}

.card-title {
  margin-bottom: $card-spacer-y;
}

.card-subtitle {
  margin-top: -$card-spacer-y / 2;
  margin-bottom: 0;
}

.card-text:last-child {
  margin-bottom: 0;
}

.card-link {
  @include hover() {
    text-decoration: none;
  }

  + .card-link {
    margin-left: $card-spacer-x;
  }
}

//
// Optional textual caps
//

.card-header {
  padding: $card-spacer-y $card-spacer-x;
  margin-bottom: 0; // Removes the default margin-bottom of <hN>
  color: $card-cap-color;
  background-color: $card-cap-bg;
  border-bottom: $card-border-width solid $card-border-color;

  &:first-child {
    @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
  }

  + .list-group {
    .list-group-item:first-child {
      border-top: 0;
    }
  }
}

.card-footer {
  padding: $card-spacer-y $card-spacer-x;
  background-color: $card-cap-bg;
  border-top: $card-border-width solid $card-border-color;

  &:last-child {
    @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
  }
}

//
// Header navs
//

.card-header-tabs {
  margin-right: -$card-spacer-x / 2;
  margin-bottom: -$card-spacer-y;
  margin-left: -$card-spacer-x / 2;
  border-bottom: 0;
}

.card-header-pills {
  margin-right: -$card-spacer-x / 2;
  margin-left: -$card-spacer-x / 2;
}

// Card image
.card-img-overlay {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: $card-img-overlay-padding;
}

.card-img,
.card-img-top,
.card-img-bottom {
  flex-shrink: 0; // For IE: https://github.com/twbs/bootstrap/issues/29396
  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
}

.card-img,
.card-img-top {
  @include border-top-radius($card-inner-border-radius);
}

.card-img,
.card-img-bottom {
  @include border-bottom-radius($card-inner-border-radius);
}

// Card deck

.card-deck {
  .card {
    margin-bottom: $card-deck-margin;
  }

  @include media-breakpoint-up(sm) {
    display: flex;
    flex-flow: row wrap;
    margin-right: -$card-deck-margin;
    margin-left: -$card-deck-margin;

    .card {
      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
      flex: 1 0 0%;
      margin-right: $card-deck-margin;
      margin-bottom: 0; // Override the default
      margin-left: $card-deck-margin;
    }
  }
}

//
// Card groups
//

.card-group {
  // The child selector allows nested `.card` within `.card-group`
  // to display properly.
  > .card {
    margin-bottom: $card-group-margin;
  }

  @include media-breakpoint-up(sm) {
    display: flex;
    flex-flow: row wrap;
    // The child selector allows nested `.card` within `.card-group`
    // to display properly.
    > .card {
      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
      flex: 1 0 0%;
      margin-bottom: 0;

      + .card {
        margin-left: 0;
        border-left: 0;
      }

      // Handle rounded corners
      @if $enable-rounded {
        &:not(:last-child) {
          @include border-right-radius(0);

          .card-img-top,
          .card-header {
            // stylelint-disable-next-line property-blacklist
            border-top-right-radius: 0;
          }
          .card-img-bottom,
          .card-footer {
            // stylelint-disable-next-line property-blacklist
            border-bottom-right-radius: 0;
          }
        }

        &:not(:first-child) {
          @include border-left-radius(0);

          .card-img-top,
          .card-header {
            // stylelint-disable-next-line property-blacklist
            border-top-left-radius: 0;
          }
          .card-img-bottom,
          .card-footer {
            // stylelint-disable-next-line property-blacklist
            border-bottom-left-radius: 0;
          }
        }
      }
    }
  }
}

//
// Columns
//

.card-columns {
  .card {
    margin-bottom: $card-columns-margin;
  }

  @include media-breakpoint-up(sm) {
    column-count: $card-columns-count;
    column-gap: $card-columns-gap;
    orphans: 1;
    widows: 1;

    .card {
      display: inline-block; // Don't let them vertically span multiple columns
      width: 100%; // Don't let their width change
    }
  }
}

//
// Accordion
//

.accordion {
  > .card {
    overflow: hidden;

    &:not(:last-of-type) {
      border-bottom: 0;
      @include border-bottom-radius(0);
    }

    &:not(:first-of-type) {
      @include border-top-radius(0);
    }

    > .card-header {
      @include border-radius(0);
      margin-bottom: -$card-border-width;
    }
  }
}


load(
    "//bazel:envoy_build_system.bzl",
    "envoy_cc_extension",
    "envoy_cc_library",
    "envoy_extension_package",
)

licenses(["notice"])  # Apache 2

# TLS inspector filter for examining various TLS parameters before routing to a FilterChain.
# Public docs: docs/root/configuration/listener_filters/tls_inspector.rst

envoy_extension_package()

envoy_cc_library(
    name = "tls_inspector_lib",
    srcs = ["tls_inspector.cc"],
    hdrs = ["tls_inspector.h"],
    external_deps = ["ssl"],
    # TODO(#9953) clean up.
    visibility = [
        "//visibility:public",
    ],
    deps = [
        "//include/envoy/event:dispatcher_interface",
        "//include/envoy/event:timer_interface",
        "//include/envoy/network:filter_interface",
        "//include/envoy/network:listen_socket_interface",
        "//source/common/api:os_sys_calls_lib",
        "//source/common/common:assert_lib",
        "//source/common/common:minimal_logger_lib",
        "//source/extensions/transport_sockets:well_known_names",
    ],
)

envoy_cc_extension(
    name = "config",
    srcs = ["config.cc"],
    # TODO(#9953) clean up.
    extra_visibility = [
        "//test/integration:__subpackages__",
    ],
    security_posture = "robust_to_untrusted_downstream",
    deps = [
        "//include/envoy/registry",
        "//include/envoy/server:filter_config_interface",
        "//source/extensions/filters/listener:well_known_names",
        "//source/extensions/filters/listener/tls_inspector:tls_inspector_lib",
        "@envoy_api//envoy/extensions/filters/listener/tls_inspector/v3:pkg_cc_proto",
    ],
)


# Widelands PATH/TO/FILE.PO
# Copyright (C) 2005-2020 Widelands Development Team
#
# Translators:
# GunChleoc, 2015
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
msgid ""
msgstr ""
"Project-Id-Version: Widelands\n"
"Report-Msgid-Bugs-To: https://www.widelands.org/wiki/ReportingBugs/\n"
"POT-Creation-Date: 2020-09-11 11:58+0000\n"
"PO-Revision-Date: 2020-09-04 08:26+0000\n"
"Last-Translator: GunChleoc\n"
"Language-Team: Chinese (China) (http://www.transifex.com/widelands/widelands/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../../data/world/critters/badger/init.lua:122
msgid "Badger"
msgstr ""

#: ../../data/world/critters/brownbear/init.lua:5
msgid "Brown bear"
msgstr ""

#: ../../data/world/critters/bunny/init.lua:5
msgid "Bunny"
msgstr "兔子"

#: ../../data/world/critters/chamois/init.lua:5
msgid "Chamois"
msgstr ""

#: ../../data/world/critters/deer/init.lua:5
msgid "Deer"
msgstr "鹿"

#: ../../data/world/critters/duck/init.lua:7
msgid "Duck"
msgstr "鸭"

#: ../../data/world/critters/fox/init.lua:5
msgid "Fox"
msgstr "福克斯"

#: ../../data/world/critters/lynx/init.lua:5
msgid "Lynx"
msgstr ""

#: ../../data/world/critters/marten/init.lua:5
msgid "Marten"
msgstr ""

#: ../../data/world/critters/moose/init.lua:5
msgid "Moose"
msgstr ""

#: ../../data/world/critters/reindeer/init.lua:5
msgid "Reindeer"
msgstr ""

#: ../../data/world/critters/sheep/init.lua:5
msgid "Sheep"
msgstr ""

#: ../../data/world/critters/stag/init.lua:5
msgid "Stag"
msgstr ""

#: ../../data/world/critters/wildboar/init.lua:5
msgid "Wild boar"
msgstr ""

#: ../../data/world/critters/wisent/init.lua:5
msgid "Wisent"
msgstr ""

#: ../../data/world/critters/wolf/init.lua:5
msgid "Wolf"
msgstr "狼"

#: ../../data/world/immovables/artifacts/artifact00/init.lua:173
#: ../../data/world/immovables/artifacts/artifact01/init.lua:7
#: ../../data/world/immovables/artifacts/artifact02/init.lua:7
#: ../../data/world/immovables/artifacts/artifact03/init.lua:7
msgid "Artifact"
msgstr ""

#: ../../data/world/immovables/miscellaneous/bar-ruin00/init.lua:7
#: ../../data/world/immovables/miscellaneous/bar-ruin01/init.lua:7
#: ../../data/world/immovables/miscellaneous/bar-ruin02/init.lua:7
#: ../../data/world/immovables/miscellaneous/bar-ruin03/init.lua:7
#: ../../data/world/immovables/miscellaneous/ruin1/init.lua:7
#: ../../data/world/immovables/miscellaneous/ruin2/init.lua:7
msgid "Ruin"
msgstr ""

#: ../../data/world/immovables/miscellaneous/debris00/init.lua:7
#: ../../data/world/immovables/miscellaneous/debris01/init.lua:7
#: ../../data/world/immovables/miscellaneous/debris02/init.lua:7
msgid "Debris"
msgstr ""

#: ../../data/world/immovables/miscellaneous/mushroom1/init.lua:7
#: ../../data/world/immovables/miscellaneous/mushroom2/init.lua:7
msgid "Mushroom"
msgstr "蘑菇"

#: ../../data/world/immovables/miscellaneous/pebble1/init.lua:7
#: ../../data/world/immovables/miscellaneous/pebble2/init.lua:7
#: ../../data/world/immovables/miscellaneous/pebble3/init.lua:7
#: ../../data/world/immovables/miscellaneous/pebble4/init.lua:7
#: ../../data/world/immovables/miscellaneous/pebble5/init.lua:7
#: ../../data/world/immovables/miscellaneous/pebble6/init.lua:7
msgid "Pebble"
msgstr "卵石"

#: ../../data/world/immovables/miscellaneous/ruin3/init.lua:7
#: ../../data/world/immovables/miscellaneous/ruin4/init.lua:7
#: ../../data/world/immovables/miscellaneous/ruin5/init.lua:7
msgid "Tombstone"
msgstr ""

#: ../../data/world/immovables/miscellaneous/skeleton1/init.lua:7
#: ../../data/world/immovables/miscellaneous/skeleton3/init.lua:7
msgid "Skeleton"
msgstr "骨架"

#: ../../data/world/immovables/miscellaneous/skeleton2/init.lua:7
#: ../../data/world/immovables/miscellaneous/skeleton4/init.lua:7
msgid "Seashell"
msgstr ""

#: ../../data/world/immovables/miscellaneous/snowman/init.lua:7
msgid "Snowman"
msgstr ""

#. TRANSLATORS: This track is made of footprints in the snow
#: ../../data/world/immovables/miscellaneous/track_winter/init.lua:8
msgid "Track"
msgstr ""

#: ../../data/world/immovables/plants/bush1/init.lua:7
#: ../../data/world/immovables/plants/bush2/init.lua:7
#: ../../data/world/immovables/plants/bush3/init.lua:7
#: ../../data/world/immovables/plants/bush4/init.lua:7
#: ../../data/world/immovables/plants/bush5/init.lua:7
msgid "Bush"
msgstr "布什"

#: ../../data/world/immovables/plants/cactus1/init.lua:7
#: ../../data/world/immovables/plants/cactus2/init.lua:7
#: ../../data/world/immovables/plants/cactus3/init.lua:7
#: ../../data/world/immovables/plants/cactus4/init.lua:7
msgid "Cactus"
msgstr "仙人掌"

#: ../../data/world/immovables/plants/grass1/init.lua:7
#: ../../data/world/immovables/plants/grass2/init.lua:7
#: ../../data/world/immovables/plants/grass3/init.lua:7
msgid "Grass"
msgstr ""

#: ../../data/world/immovables/rocks/blackland/init.lua:7
#: ../../data/world/immovables/rocks/desert/init.lua:7
#: ../../data/world/immovables/rocks/greenland/init.lua:7
#: ../../data/world/immovables/rocks/winterland/init.lua:7
msgid "Rocks 1"
msgstr ""

#: ../../data/world/immovables/rocks/blackland/init.lua:26
#: ../../data/world/immovables/rocks/desert/init.lua:26
#: ../../data/world/immovables/rocks/greenland/init.lua:26
#: ../../data/world/immovables/rocks/winterland/init.lua:26
msgid "Rocks 2"
msgstr ""

#: ../../data/world/immovables/rocks/blackland/init.lua:45
#: ../../data/world/immovables/rocks/desert/init.lua:45
#: ../../data/world/immovables/rocks/greenland/init.lua:45
#: ../../data/world/immovables/rocks/winterland/init.lua:45
msgid "Rocks 3"
msgstr ""

#: ../../data/world/immovables/rocks/blackland/init.lua:64
#: ../../data/world/immovables/rocks/desert/init.lua:64
#: ../../data/world/immovables/rocks/greenland/init.lua:64
#: ../../data/world/immovables/rocks/winterland/init.lua:64
msgid "Rocks 4"
msgstr ""

#: ../../data/world/immovables/rocks/blackland/init.lua:83
#: ../../data/world/immovables/rocks/desert/init.lua:83
#: ../../data/world/immovables/rocks/greenland/init.lua:83
#: ../../data/world/immovables/rocks/winterland/init.lua:83
msgid "Rocks 5"
msgstr ""

#: ../../data/world/immovables/rocks/blackland/init.lua:102
#: ../../data/world/immovables/rocks/desert/init.lua:102
#: ../../data/world/immovables/rocks/greenland/init.lua:102
#: ../../data/world/immovables/rocks/winterland/init.lua:102
msgid "Rocks 6"
msgstr ""

#: ../../data/world/immovables/standing_stones/standing_stone1_desert/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone1_summer/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone1_wasteland/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone1_winter/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone2_desert/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone2_summer/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone2_wasteland/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone2_winter/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone3_desert/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone3_summer/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone3_wasteland/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone3_winter/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone4_desert/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone4_summer/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone4_wasteland/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone4_winter/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone5_desert/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone5_summer/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone5_wasteland/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone5_winter/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone6/init.lua:7
#: ../../data/world/immovables/standing_stones/standing_stone7/init.lua:7
msgid "Standing Stone"
msgstr ""

#: ../../data/world/immovables/trees/alder/init.lua:22
msgid "Alder (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/alder/init.lua:47
msgid "Alder (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/alder/init.lua:72
msgid "Alder (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/alder/init.lua:97
msgid "Alder (Old)"
msgstr ""

#: ../../data/world/immovables/trees/alder/init.lua:98
msgid "Alder"
msgstr ""

#: ../../data/world/immovables/trees/aspen/init.lua:14
msgid "Aspen (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/aspen/init.lua:39
msgid "Aspen (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/aspen/init.lua:64
msgid "Aspen (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/aspen/init.lua:92
msgid "Aspen (Old)"
msgstr ""

#: ../../data/world/immovables/trees/aspen/init.lua:93
msgid "Aspen"
msgstr ""

#: ../../data/world/immovables/trees/beech/init.lua:14
msgid "Beech (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/beech/init.lua:39
msgid "Beech (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/beech/init.lua:64
msgid "Beech (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/beech/init.lua:89
msgid "Beech (Old)"
msgstr ""

#: ../../data/world/immovables/trees/beech/init.lua:90
msgid "Beech"
msgstr ""

#: ../../data/world/immovables/trees/birch/init.lua:14
msgid "Birch (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/birch/init.lua:39
msgid "Birch (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/birch/init.lua:64
msgid "Birch (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/birch/init.lua:92
msgid "Birch (Old)"
msgstr ""

#: ../../data/world/immovables/trees/birch/init.lua:93
msgid "Birch"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/cirrus/init.lua:15
msgid "Cirrus Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/cirrus/init.lua:41
msgid "Cirrus Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/cirrus/init.lua:67
msgid "Cirrus Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/cirrus/init.lua:93
msgid "Cirrus Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/cirrus/init.lua:95
msgid "Cirrus Tree"
msgstr ""

#: ../../data/world/immovables/trees/deadtree1/init.lua:7
#: ../../data/world/immovables/trees/deadtree2/init.lua:7
#: ../../data/world/immovables/trees/deadtree3/init.lua:7
#: ../../data/world/immovables/trees/deadtree4/init.lua:7
#: ../../data/world/immovables/trees/deadtree5/init.lua:7
#: ../../data/world/immovables/trees/deadtree6/init.lua:7
msgid "Dead Tree"
msgstr ""

#: ../../data/world/immovables/trees/fallentree/init.lua:5
msgid "Fallen Tree"
msgstr ""

#: ../../data/world/immovables/trees/larch/init.lua:14
msgid "Larch (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/larch/init.lua:39
msgid "Larch (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/larch/init.lua:64
msgid "Larch (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/larch/init.lua:89
msgid "Larch (Old)"
msgstr ""

#: ../../data/world/immovables/trees/larch/init.lua:90
msgid "Larch"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/liana/init.lua:15
msgid "Liana Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/liana/init.lua:41
msgid "Liana Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/liana/init.lua:67
msgid "Liana Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/liana/init.lua:96
msgid "Liana Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/liana/init.lua:98
msgid "Liana Tree"
msgstr ""

#: ../../data/world/immovables/trees/maple/init.lua:14
msgid "Maple (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/maple/init.lua:39
msgid "Maple (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/maple/init.lua:64
msgid "Maple (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/maple/init.lua:89
msgid "Maple (Old)"
msgstr ""

#: ../../data/world/immovables/trees/maple/init.lua:90
msgid "Maple"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_dark/init.lua:15
msgid "Dark Mushroom Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_dark/init.lua:41
msgid "Dark Mushroom Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_dark/init.lua:67
msgid "Dark Mushroom Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_dark/init.lua:93
msgid "Dark Mushroom Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_dark/init.lua:95
msgid "Dark Mushroom Tree"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_green/init.lua:15
msgid "Green Mushroom Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_green/init.lua:41
msgid "Green Mushroom Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_green/init.lua:67
msgid "Green Mushroom Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_green/init.lua:93
msgid "Green Mushroom Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_green/init.lua:95
msgid "Green Mushroom Tree"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_red/init.lua:15
msgid "Red Mushroom Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_red/init.lua:41
msgid "Red Mushroom Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_red/init.lua:67
msgid "Red Mushroom Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_red/init.lua:96
msgid "Red Mushroom Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/mushroom_red/init.lua:98
msgid "Red Mushroom Tree"
msgstr ""

#: ../../data/world/immovables/trees/oak/init.lua:14
msgid "Oak (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/oak/init.lua:39
msgid "Oak (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/oak/init.lua:64
msgid "Oak (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/oak/init.lua:89
msgid "Oak (Old)"
msgstr ""

#: ../../data/world/immovables/trees/oak/init.lua:90
msgid "Oak"
msgstr ""

#: ../../data/world/immovables/trees/palm_borassus/init.lua:14
msgid "Borassus Palm (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/palm_borassus/init.lua:39
msgid "Borassus Palm (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/palm_borassus/init.lua:64
msgid "Borassus Palm (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/palm_borassus/init.lua:89
msgid "Borassus Palm (Old)"
msgstr ""

#: ../../data/world/immovables/trees/palm_borassus/init.lua:90
msgid "Borassus Palm"
msgstr ""

#: ../../data/world/immovables/trees/palm_coconut/init.lua:14
msgid "Coconut Palm (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/palm_coconut/init.lua:39
msgid "Coconut Palm (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/palm_coconut/init.lua:64
msgid "Coconut Palm (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/palm_coconut/init.lua:89
msgid "Coconut Palm (Old)"
msgstr ""

#: ../../data/world/immovables/trees/palm_coconut/init.lua:90
msgid "Coconut Palm"
msgstr ""

#: ../../data/world/immovables/trees/palm_date/init.lua:14
msgid "Date Palm (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/palm_date/init.lua:39
msgid "Date Palm (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/palm_date/init.lua:64
msgid "Date Palm (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/palm_date/init.lua:92
msgid "Date Palm (Old)"
msgstr ""

#: ../../data/world/immovables/trees/palm_date/init.lua:93
msgid "Date Palm"
msgstr ""

#: ../../data/world/immovables/trees/palm_oil/init.lua:14
msgid "Oil Palm (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/palm_oil/init.lua:39
msgid "Oil Palm (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/palm_oil/init.lua:64
msgid "Oil Palm (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/palm_oil/init.lua:93
msgid "Oil Palm (Old)"
msgstr ""

#: ../../data/world/immovables/trees/palm_oil/init.lua:94
msgid "Oil Palm"
msgstr ""

#: ../../data/world/immovables/trees/palm_roystonea/init.lua:14
msgid "Roystonea regia Palm (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/palm_roystonea/init.lua:39
msgid "Roystonea regia Palm (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/palm_roystonea/init.lua:64
msgid "Roystonea regia Palm (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/palm_roystonea/init.lua:89
msgid "Roystonea regia Palm (Old)"
msgstr ""

#: ../../data/world/immovables/trees/palm_roystonea/init.lua:90
msgid "Roystonea regia Palm"
msgstr ""

#: ../../data/world/immovables/trees/rowan/init.lua:14
msgid "Rowan (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/rowan/init.lua:39
msgid "Rowan (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/rowan/init.lua:64
msgid "Rowan (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/rowan/init.lua:92
msgid "Rowan (Old)"
msgstr ""

#: ../../data/world/immovables/trees/rowan/init.lua:93
msgid "Rowan"
msgstr ""

#: ../../data/world/immovables/trees/spruce/init.lua:14
msgid "Spruce (Sapling)"
msgstr ""

#: ../../data/world/immovables/trees/spruce/init.lua:39
msgid "Spruce (Pole)"
msgstr ""

#: ../../data/world/immovables/trees/spruce/init.lua:64
msgid "Spruce (Mature)"
msgstr ""

#: ../../data/world/immovables/trees/spruce/init.lua:89
msgid "Spruce (Old)"
msgstr ""

#: ../../data/world/immovables/trees/spruce/init.lua:90
msgid "Spruce"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/twine/init.lua:15
msgid "Twine Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/twine/init.lua:41
msgid "Twine Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/twine/init.lua:67
msgid "Twine Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/twine/init.lua:93
msgid "Twine Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/twine/init.lua:95
msgid "Twine Tree"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_green/init.lua:15
msgid "Green Umbrella Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_green/init.lua:41
msgid "Green Umbrella Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_green/init.lua:67
msgid "Green Umbrella Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_green/init.lua:93
msgid "Green Umbrella Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_green/init.lua:95
msgid "Green Umbrella Tree"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_red/init.lua:15
msgid "Red Umbrella Tree (Sapling)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_red/init.lua:41
msgid "Red Umbrella Tree (Pole)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_red/init.lua:67
msgid "Red Umbrella Tree (Mature)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_red/init.lua:96
msgid "Red Umbrella Tree (Old)"
msgstr ""

#. TRANSLATORS: This is a fictitious tree. Be creative if you want.
#: ../../data/world/immovables/trees/umbrella_red/init.lua:98
msgid "Red Umbrella Tree"
msgstr ""

#. TRANSLATORS: A category in the editor for placing animals on the map.
#: ../../data/world/init.lua:121
msgid "Herbivores"
msgstr ""

#. TRANSLATORS: A category in the editor for placing animals on the map.
#: ../../data/world/init.lua:139
msgid "Carnivores"
msgstr ""

#. TRANSLATORS: A category in the editor for placing animals on the map.
#: ../../data/world/init.lua:154
msgid "Aquatic"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:168
msgid "Miscellaneous"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:207
msgid "Artifacts"
msgstr ""

#: ../../data/world/init.lua:207
msgid "These immovables are used by the win condition “Artifacts”."
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:220
msgid "Plants"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:242
msgid "Standing Stones"
msgstr ""

#: ../../data/world/init.lua:277
msgid "Rocks"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:314
msgid "Dead Trees"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:330
msgid "Coniferous Trees"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:348
msgid "Deciduous Trees"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:391
msgid "Palm Trees"
msgstr ""

#. TRANSLATORS: A category in the editor for placing immovables on the map.
#: ../../data/world/init.lua:424
msgid "Wasteland Trees"
msgstr ""

#. TRANSLATORS: A category in the editor for placing terrains on the map.
#: ../../data/world/init.lua:486
msgid "Summer"
msgstr ""

#. TRANSLATORS: A category in the editor for placing terrains on the map.
#: ../../data/world/init.lua:515
msgid "Wasteland"
msgstr "荒地"

#. TRANSLATORS: A category in the editor for placing terrains on the map.
#: ../../data/world/init.lua:543
msgid "Winter"
msgstr ""

#. TRANSLATORS: A category in the editor for placing terrains on the map.
#: ../../data/world/init.lua:571
msgid "Desert"
msgstr "沙漠"

#: ../../data/world/resources/init.lua:110
msgid "Coal"
msgstr "煤"

#: ../../data/world/resources/init.lua:126
msgid "Gold"
msgstr ""

#: ../../data/world/resources/init.lua:142
msgid "Iron"
msgstr "铁"

#: ../../data/world/resources/init.lua:158
msgid "Stones"
msgstr "石头"

#: ../../data/world/resources/init.lua:174
#: ../../data/world/terrains/desert/water/init.lua:5
#: ../../data/world/terrains/summer/water/init.lua:5
#: ../../data/world/terrains/wasteland/water/init.lua:5
#: ../../data/world/terrains/winter/water/init.lua:5
msgid "Water"
msgstr "水"

#: ../../data/world/resources/init.lua:190
msgid "Fish"
msgstr "鱼"

#: ../../data/world/terrains/desert/beach/init.lua:177
#: ../../data/world/terrains/summer/beach/init.lua:5
#: ../../data/world/terrains/wasteland/beach/init.lua:5
#: ../../data/world/terrains/winter/beach/init.lua:5
msgid "Beach"
msgstr ""

#: ../../data/world/terrains/desert/desert1/init.lua:5
msgid "Desert 1"
msgstr ""

#: ../../data/world/terrains/desert/desert2/init.lua:5
msgid "Desert 2"
msgstr ""

#: ../../data/world/terrains/desert/desert3/init.lua:5
msgid "Desert 3"
msgstr ""

#: ../../data/world/terrains/desert/desert4/init.lua:5
msgid "Desert 4"
msgstr ""

#: ../../data/world/terrains/desert/drysoil/init.lua:5
msgid "Dry Soil"
msgstr ""

#: ../../data/world/terrains/desert/forested_mountain1/init.lua:5
#: ../../data/world/terrains/summer/forested_mountain1/init.lua:5
#: ../../data/world/terrains/wasteland/forested_mountain1/init.lua:5
#: ../../data/world/terrains/winter/forested_mountain1/init.lua:5
msgid "Forested Mountain 1"
msgstr ""

#: ../../data/world/terrains/desert/forested_mountain2/init.lua:5
#: ../../data/world/terrains/summer/forested_mountain2/init.lua:5
#: ../../data/world/terrains/wasteland/forested_mountain2/init.lua:5
#: ../../data/world/terrains/winter/forested_mountain2/init.lua:5
msgid "Forested Mountain 2"
msgstr ""

#: ../../data/world/terrains/desert/highmountainmeadow/init.lua:5
msgid "High Mountain Meadow"
msgstr ""

#: ../../data/world/terrains/desert/meadow/init.lua:5
msgid "Meadow"
msgstr ""

#: ../../data/world/terrains/desert/mountain1/init.lua:5
#: ../../data/world/terrains/summer/mountain1/init.lua:5
#: ../../data/world/terrains/wasteland/mountain1/init.lua:5
#: ../../data/world/terrains/winter/mountain1/init.lua:5
msgid "Mountain 1"
msgstr ""

#: ../../data/world/terrains/desert/mountain2/init.lua:5
#: ../../data/world/terrains/summer/mountain2/init.lua:5
#: ../../data/world/terrains/wasteland/mountain2/init.lua:5
#: ../../data/world/terrains/winter/mountain2/init.lua:5
msgid "Mountain 2"
msgstr ""

#: ../../data/world/terrains/desert/mountain3/init.lua:5
#: ../../data/world/terrains/summer/mountain3/init.lua:5
#: ../../data/world/terrains/wasteland/mountain3/init.lua:5
#: ../../data/world/terrains/winter/mountain3/init.lua:5
msgid "Mountain 3"
msgstr ""

#: ../../data/world/terrains/desert/mountain4/init.lua:5
#: ../../data/world/terrains/summer/mountain4/init.lua:5
#: ../../data/world/terrains/wasteland/mountain4/init.lua:5
#: ../../data/world/terrains/winter/mountain4/init.lua:5
msgid "Mountain 4"
msgstr ""

#: ../../data/world/terrains/desert/mountainmeadow/init.lua:5
#: ../../data/world/terrains/summer/mountain_meadow/init.lua:5
msgid "Mountain Meadow"
msgstr ""

#: ../../data/world/terrains/desert/steppe/init.lua:5
#: ../../data/world/terrains/summer/steppe/init.lua:5
msgid "Steppe"
msgstr ""

#: ../../data/world/terrains/summer/lava/init.lua:5
msgid "Lava"
msgstr ""

#: ../../data/world/terrains/summer/meadow1/init.lua:5
msgid "Meadow 1"
msgstr ""

#: ../../data/world/terrains/summer/meadow2/init.lua:5
msgid "Meadow 2"
msgstr ""

#: ../../data/world/terrains/summer/meadow3/init.lua:5
msgid "Meadow 3"
msgstr ""

#: ../../data/world/terrains/summer/meadow4/init.lua:5
msgid "Meadow 4"
msgstr ""

#: ../../data/world/terrains/summer/snow/init.lua:5
#: ../../data/world/terrains/winter/snow/init.lua:5
msgid "Snow"
msgstr ""

#: ../../data/world/terrains/summer/steppe_barren/init.lua:5
msgid "Barren Steppe"
msgstr ""

#: ../../data/world/terrains/summer/swamp/init.lua:5
msgid "Swamp"
msgstr ""

#: ../../data/world/terrains/wasteland/ashes1/init.lua:5
msgid "Ashes 1"
msgstr ""

#: ../../data/world/terrains/wasteland/ashes2/init.lua:5
msgid "Ashes 2"
msgstr ""

#: ../../data/world/terrains/wasteland/hardground1/init.lua:5
msgid "Hard Ground 1"
msgstr ""

#: ../../data/world/terrains/wasteland/hardground2/init.lua:5
msgid "Hard Ground 2"
msgstr ""

#: ../../data/world/terrains/wasteland/hardground3/init.lua:5
msgid "Hard Ground 3"
msgstr ""

#: ../../data/world/terrains/wasteland/hardground4/init.lua:5
msgid "Hard Ground 4"
msgstr ""

#: ../../data/world/terrains/wasteland/hardlava/init.lua:5
msgid "Igneous Rocks"
msgstr ""

#: ../../data/world/terrains/wasteland/lava_stone1/init.lua:5
msgid "Lava Rocks 1"
msgstr ""

#: ../../data/world/terrains/wasteland/lava_stone2/init.lua:5
msgid "Lava Rocks 2"
msgstr ""

#: ../../data/world/terrains/winter/ice/init.lua:5
msgid "Ice"
msgstr ""

#: ../../data/world/terrains/winter/ice_floes/init.lua:5
msgid "Ice Floes 1"
msgstr ""

#: ../../data/world/terrains/winter/ice_floes2/init.lua:5
msgid "Ice Floes 2"
msgstr ""

#: ../../data/world/terrains/winter/taiga/init.lua:5
msgid "Taiga"
msgstr ""

#: ../../data/world/terrains/winter/tundra/init.lua:5
msgid "Tundra 1"
msgstr ""

#: ../../data/world/terrains/winter/tundra2/init.lua:5
msgid "Tundra 2"
msgstr ""

#: ../../data/world/terrains/winter/tundra3/init.lua:5
msgid "Tundra 3"
msgstr ""

#: ../../data/world/terrains/winter/tundra_taiga/init.lua:5
msgid "Tundra Taiga"
msgstr ""


package java.io

trait Flushable {
  def flush(): Unit
}


#!/bin/bash
set -e
apt-get update
#apt-get dist-upgrade -y
apt-get install -y python2.7 python-gdal python-pip libpython2.7-dev python-tk build-essential golang libgdal-dev libspatialindex-dev git
pip install --upgrade pip
pip install georasters numpy scikit-image scipy cython rtree
#pip install tensorflow-gpu
mkdir -p /wdata/spacenet2017/favyen/graphs/ /wdata/spacenet2017/favyen/truth/


---
layout: post
title: Polyglot Version 1.1.0
lang: en
---

Polyglot now fully supports [Jekyll 3.0](https://jekyllrb.com/news/2015/10/26/jekyll-3-0-released/) blogs! Go [give it a try!](https://github.com/untra/polyglot)

{% highlight yaml %}
gem 'jekyll-polyglot', '~> 1.1.0'
{% endhighlight %}


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Dooble: dooble_tab_bar Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>

<link href="search/search.css" rel="stylesheet" type="text/css"/>

<link href="doxygen.css" rel="stylesheet" type="text/css" />

Dooble

Signals |
Public Member Functions |
Protected Member Functions |
List of all members

dooble_tab_bar Class Reference

Inheritance diagram for dooble_tab_bar:

[legend]

Collaboration diagram for dooble_tab_bar:

[legend]

Signals

void 	application_locked (bool state, dooble *d)

void 	decouple_tab (int index)

void 	new_tab (void)

void 	open_tab_as_new_private_window (int index)

void 	open_tab_as_new_window (int index)

void 	reload_tab (int index)

void 	reload_tab_periodically (int index, int seconds)

void 	set_visible_corner_button (bool state)

void 	show_corner_widget (bool state)

Public Member Functions

 	dooble_tab_bar (QWidget *parent)

void 	set_corner_widget (QWidget *widget)

Protected Member Functions

QSize 	tabSizeHint (int index) const

void 	hideEvent (QHideEvent *event)

void 	showEvent (QShowEvent *event)

void 	tabLayoutChange (void)

The documentation for this class was generated from the following files:

Source/dooble_tab_bar.h

Source/dooble_tab_bar.cc

<address class="footer">
Generated by

 1.8.17
</address>


//
//  HNAboutViewController.h
//  HackerNewsReader
//
//  Created by Ryan Nystrom on 2/2/16.
//  Copyright © 2016 Ryan Nystrom. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface HNAboutViewController : UIViewController

@property (nonatomic, copy) NSString *aboutText;

@end


#Generated by Maven Ant Plugin - DO NOT EDIT THIS FILE!
#Tue Apr 09 09:01:26 PDT 2019
maven.build.testDir.0=src/test/java
maven.settings.offline=false
commons.encoding=iso-8859-1
commons.compiler.javac=
commons.osgi.dynamicImport=
commons.docEncoding=iso-8859-1
commons.release.2.name=commons-compress-${commons.release.2.version}
maven.settings.interactiveMode=true
commons.osgi.private=
commons.release.version=1.0
commons.componentid=compress
maven.reporting.outputDirectory=${maven.build.dir}/site
commons.osgi.symbolicName=org.apache.commons.compress
project.build.sourceEncoding=iso-8859-1
maven.build.testOutputDir=${maven.build.dir}/test-classes
commons.compiler.fork=false
commons.binary.suffix=-bin
maven.build.finalName=commons-compress-1.1-SNAPSHOT
maven.test.reports=${maven.build.dir}/test-reports
commons.osgi.export=org.apache.commons.*;version\=1.1-SNAPSHOT;-noimport\:\=true
commons.release.name=commons-compress-1.0
maven.compile.target=1.4
distMgmtSnapshotsName=Apache Development Snapshot Repository
maven.repo.local=${user.home}/.m2/repository
maven.build.dir=target
distMgmtSnapshotsUrl=https\://repository.apache.org/content/repositories/snapshots
commons.surefire.java=
maven.build.outputDir=${maven.build.dir}/classes
project.reporting.outputEncoding=iso-8859-1
commons.osgi.import=*
commons.surefire.version=2.5
project.build.directory=${maven.build.dir}
maven.build.resourceDir.0=.
commons.release.2.desc=
organization.logo=http\://www.apache.org/images/asf_logo_wide.gif
commons.manifestfile=target/osgi/MANIFEST.MF
commons.jira.pid=12310904
maven.build.srcDir.0=src/main/java
commons.rc.version=RC2
commons.release.2.binary.suffix=-bin
commons.compiler.compilerVersion=
maven.build.testResourceDir.0=src/test/resources
maven.compile.source=1.4
commons.deployment.protocol=scp
project.build.outputDirectory=${maven.build.outputDir}
sourceReleaseAssemblyDescriptor=source-release
commons.release.desc=
commons.jira.id=COMPRESS


span.cm-underlined {
  text-decoration: underline;
}
span.cm-strikethrough {
  text-decoration: line-through;
}
span.cm-brace {
  color: #170;
  font-weight: bold;
}
span.cm-table {
  color: blue;
  font-weight: bold;
}


import Vue from 'vue'
import Vuex from 'vuex'
import VuexI18n from 'vuex-i18n' // load vuex i18n module
import app from './modules/app'

import * as getters from './getters'

Vue.use(Vuex)

const store = new Vuex.Store({
  strict: true, // process.env.NODE_ENV !== 'production',
  getters,
  modules: {
    app,
  },
  state: {},
  mutations: {},
})

Vue.use(VuexI18n.plugin, store)

export default store